在多个表中搜索时,MySQL在表中复制行结果

时间:2015-04-26 17:03:34

标签: php mysql

我在mySQL数据库中有三个用于用户的表,一个用于颜色,一个用于将用户链接到颜色

Table 1 users
==============
ID | Name
--------------
1  | John
2  | Jayne
3  | Fred

Table 2 colours
==============
ID | Colour
--------------
1  | Blue
2  | Red
3  | Yellow

Table 3 link
==============
ID | Name | Colour
--------------
1  | 1    | 1
2  | 1    | 2
3  | 2    | 1
4  | 3    | 2
5  | 3    | 3

正如你所看到的,一些用户有不止一种喜欢的颜色(是的,我知道,有多烦人)。

目前,我可以将它们显示在一张桌子中,并在列中添加他们喜欢的颜色。

但是,我希望能够按颜色过滤表格结果。

我只使用一种颜色的过滤器就可以做到这一点,但问题是两种颜色。

如果我想查看哪个用户选择了例如蓝色和红色,我得到零结果。

如何在不创建搜索的情况下获得此结果,从而导致每行专用于一种颜色,然后依次显示相同的用户两次(一次用于红色,一次用于蓝色)。

我希望这是有道理的

感谢提前

修改

我使用的示例查询是

SELECT * FROM users, colours, link WHERE users.id = link.name AND link.colour = colours.id

替代显示特定颜色

SELECT * FROM users, colours, link WHERE users.id = link.name AND link.colour = colours.id AND link.colour = 1

但对于显示重复的双重过滤器

SELECT * FROM users, colours, link WHERE users.id = link.name AND link.colour = colours.id AND link.colour = 1 OR link.colour = 2

1 个答案:

答案 0 :(得分:1)

如果看起来就在这里是代码:

SELECT Name FROM users
WHERE ID IN (SELECT DISTINCT(Name) AS Name 
             FROM link L
             WHERE 2 IN (SELECT Colour FROM link L2 WHERE L.Name = L2.Name)
             AND 1 IN (SELECT Colour FROM link L2 WHERE L.Name = L2.Name))

现在让我试着解释一下L和L2是什么......首先对不起我的英语我会尽我所能为你理解......

我们在同一个表上创建子查询,因此我们需要为表使用别名。我们使用别名来提供仅用于该查询的临时名称表或列。

别名的示例是当我们从表中选择一些列(价格数量)时,假设我们要计算Price * quantity并将该列选为 total (总计将是我们执行查询后返回的表中该列的名称)。列名总计也可以给别名。我们包括别名:

 SELECT Price, Quantity, (Price * Quantity) AS **total**
 FROM t1...

那将返回三列价格,数量,总计......如果我们不使用此 AS总数,该列的名称将为Price * Quantity ...

所以这里我们使用L和L2来了解哪个列名是来自SELECT查询的哪一部分。如果我们不在子查询中使用别名

 SELECT Colour FROM link L2 WHERE L.Name = L2.Name

我们会遇到问题因为子查询会像这样锁定:

 SELECT Colour FROM link WHERE Name = Name

没有多大意义,不是吗?

所以基本上我们在这个查询中临时重命名表,因为我们需要知道哪个列从哪个表中胜出其他一个,否则数据库会有问题选择...

我希望这对你有意义。如果您有任何进一步的问题,请随意询问我会尽力向您解释。

我希望我没有让它变得更复杂......

GL!

修改

嗨,我又做了一些事情,并且我发现你的问题可能比我给你的第一个答案更好......希望现在还不晚!

 SELECT u.Name
 FROM users u
 INNER JOIN link L
 ON u.ID = L.Name
 INNER JOIN link l2
 ON L.Name = L2.Name
 WHERE L.Colour = 2 AND L2.Colour = 1

看那个SQL Fiddle ......