从左连接表中选择多个条件为真的行

时间:2015-02-06 14:46:31

标签: mysql sql join

我目前有以下情况:

我正在尝试构建一个过滤器,我可以使用该过滤器选择具有一组给定属性的每一行。我将用一个例子解释这个:

SELECT table1.name FROM table1
LEFT JOIN table2 ON table1.ID = table2.ID
WHERE table2.propertyID = "First PropertyID" AND table2.propertyID = "Second PropertyID"

显然,每次都返回null。但我无法弄清楚如何做到这一点..

表1有两列:ID和Name。 表2如下所示:

| ID  | PropertyID |
|  1  |     3      |
|  1  |     5      |
|  1  |     7      |
|  2  |     6      |
|  2  |     1      |

我希望能够从表1中选择连接到例如表1的行。 PropertyID 3和5.

我找到了很多例子,但这些都是使用OR或IN,但我需要AND就是这种情况。

甚至可以使用MySQL,还是需要创建一些解决方法?

非常感谢任何帮助。

修改1:

表1如下所示:

| ID  |   Name    |
|  1  |   test    |
|  2  |   hello   |

就我而言,我需要做更多LEFT JOINS才能到达table2,但我认为这个例子足以获得正确的方法。

3 个答案:

答案 0 :(得分:3)

当外连接时,将外表条件移动到ON子句,否则外连接的行为就像内连接一样:

SELECT table1.name FROM table1
LEFT JOIN table2 ON table1.ID = table2.ID
    AND   table2.propertyID = "First PropertyID"
    AND   table2.property = "Second PropertyID"

答案 1 :(得分:2)

我建议你退后一步,在没有连接的情况下考虑这个问题。您想知道哪些行与属性3和5相关。您可以在没有这样的连接的情况下执行此操作:

SELECT tab1ID
FROM table2
WHERE propertyID = 3 OR propertyID = 5
GROUP BY tab1ID
HAVING COUNT(*) = 2;

要从表1中获取信息,您可以进行内部联接,以便只返回id 1:

SELECT t1.name
FROM table1 t1
JOIN table2 t2 ON t2.tab1ID = t1.id
WHERE t2.propertyid = 3 OR t2.propertyid = 5
GROUP BY t1.id
HAVING COUNT(*) = 2;

以下是SQL Fiddle示例。

答案 2 :(得分:0)

你的意思是这样的: 使用OR代替AND

SELECT table1.name FROM table1
LEFT JOIN table2 ON table1.ID = table2.ID
WHERE table2.propertyID = "First PropertyID" 
OR table2.propertyID = "Second PropertyID"

或使用IN

SELECT table1.name FROM table1
LEFT JOIN table2 ON table1.ID = table2.ID
WHERE table2.propertyID IN( "First PropertyID","Second PropertyID")

但我想,你也需要Group By功能。