繁体   English   中英

多个连接的SQL查询

[英]SQL query of multiple joins

我在处理连接时遇到问题

这是我的第一张表:

CREATE TABLE IF NOT EXISTS `form` (
  `id_form` int(20) NOT NULL AUTO_INCREMENT,
  `nameform` varchar(50) NOT NULL,
  PRIMARY KEY (`id_form`)
)      

表中的数据

INSERT INTO `form` (`id_form`, `nameform`) VALUES
  (1, 'Formulaire commun'),
  (2, 'Formulaire FCPR'),
  (3, 'Formulaire fonds d''amorçage'),
  (4, 'Formulaire FOPRODI'),
  (5, 'Formulaire ITP'),
  (6, 'Formulaire PASRI'),
  (7, 'Formulaire PCAM'),
  (8, 'Formulaire PIRD'),
  (9, 'Formulaire PMN'),
  (10, 'Formulaire PNRI'),
  (11, 'Formulaire PRF'),
  (12, 'Formulaire RIICTIC'),
  (13, 'Formulaire VRR');

我的第二个表userdata:

CREATE TABLE IF NOT EXISTS `donnée_utilisateur` (
  `id_d` int(20) NOT NULL AUTO_INCREMENT,
  `id_form` int(20) NOT NULL,
  `id_us` int(20) NOT NULL,
  PRIMARY KEY (`id_d`),
  KEY `id-form` (`id_form`),
  KEY `id-us` (`id_us`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=407 ;

ALTER TABLE `donnée_utilisateur`
ADD CONSTRAINT `fvdsvsd` FOREIGN KEY (`id_us`) REFERENCES `utilisateur` (`id_us`),
ADD CONSTRAINT `ssssssssssss` FOREIGN KEY (`id_form`) REFERENCES `form` (`id_form`);

其中的数据:

INSERT INTO `donnée_utilisateur` (`id_d`,  `id_form`, `id_us`) VALUES
  (380, 2, 6),
  (381,  2, 6),
  (382,  3, 6),
  (383,  3, 6),
  (384,  4, 6),
  (385,  5, 6);

最后是用户表:

CREATE TABLE IF NOT EXISTS `utilisateur` (
  `id_us` int(20) NOT NULL AUTO_INCREMENT,
  PRIMARY KEY (`id_us`),

) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=8 ;

数据 :

INSERT INTO `utilisateur` (`id_us`) VALUES
  (3),
  (6),
  (7);

我想要做的是获取特定用户的userdata表中不存在的id_form

我试过这样做:

SELECT f.id_form
FROM  `donnée_utilisateur` d
RIGHT JOIN `form` f ON f.id_form=d.id_form Where d.id_d IS NULL  

如果我们有这样的数据,此查询会导致此结果:

id_form
1
6
7 
8
9
10
11
12
13

这是预期的结果,这是正确的。 如果我想要特定用户的这个结果,我改变它:

SELECT f.id_form
FROM  `donnée_utilisateur` d
RIGHT JOIN `form` f ON f.id_form=d.id_form 
INNER JOIN  `utilisateur` u ON u.id_us=d.id_us Where d.id_d IS NULL AND id_us=6

我什么也没得到,或者它应该像我刚写的结果一样。 让我们id_us=7一个id_us=7例子

SELECT f.id_form
FROM  `donnée_utilisateur` d
RIGHT JOIN `form` f ON f.id_form=d.id_form 
INNER JOIN  `utilisateur` u ON u.id_us=d.id_us Where d.id_d IS NULL AND u. id_us=7

这应该导致所有id_form从1到12,因为用户没有插入任何数据。

右连接非常难以阅读,因此容易出错。 通常,您必须从必须从中获取数据的表开始,然后从左外连接表中获取数据。

我们来看看你的查询:

  1. 你在表donnée_utilisateur之后加入,所以donnée_utilisateur将外部联系到其他表。
  2. 其他表格是formutilisateur 您没有将两者结合起来的连接标准,因此您将它们交叉连接, utilisateur每个form与每个utilisateur组合在一起。
  3. 所以对于这个交叉加入产品你外部加入donnée_utilisateur
  4. Where d.id_d IS NULL使其成为反连接。 用于替换DBMS中仅仅是NOT EXISTSNOT IN的技巧,这些技巧在这些直接方法中存在缺陷。 您可以使用它来获取donnée_utilisateur没有条目的所有form / utilisateur组合。 可能很多。
  5. Where id_us=6进一步缩小了结果。 不幸的是你忘了使用限定符。 u.id_us还是d.id_us DBMS无法知道。 让我们说它决定你的意思是d.id_us 该字段始终为空,因为您只是驳回了所有匹配项。 d.id_us = 6永远不会为真,因此所有行都会被丢弃。 你的结果是空的。 如果DBMS u.id_us你的意思是u.id_us ,你可以获得结果,特别是同样的id_form一遍又一遍。

您可能想要添加限定符u ,但我建议您重新编写整个查询并使用NOT INNOT EXISTS

无论如何,你的查询有什么utilisateur 我想你在哪里寻找donnée_utilisateur不存在用户6的donnée_utilisateur 为什么要加入utilisateur (如果你加入它,你应该将它加入到donnée_utilisateur 。)

您可以使用subselect

select id_form  from form where 
id_form not in (select distinct id_form from  donnée_utilisateur where id_us=6 )

或RDBMS引擎正确

select id_form  from form where 
id_form not in (select  id_form from  donnée_utilisateur where id_us=6 )

Thorsten非常善于澄清,但未提供完整的查询来帮助您。 您原来的右连接查询非常接近。 但是,我已切换到左连接,如下所示:

SELECT
      f.id_form,
      f.nameform
   from
      form f
         left join donnée_utilisateur d
            ON f.id_form = d.id_form 
            AND d.id_us = 6
   where 
      d.id_d IS NULL

所以,我从FORM表开始获取ID和名称。 没问题。 现在,您考虑在辅助表中找不到表单,因此这是表单ID上的左连接并在where子句中查找NULL。 但是,这本身就是为任何用户提供表格。 要完成对特定用户的需求,只需将AND子句添加到辅助表中,以便THAT部分保留为FORM AND特定用户的左连接,从而导致d.id_d列为NULL

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM