我在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
答案 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 ......