如何使用JOIN左侧的AND选择多个记录

时间:2011-04-01 13:53:32

标签: mysql inner-join

我有一个简单的要求,但无法正确获取SELECT语句,因此它将提供所需的结果。

我有两张桌子: -

  1. 具有ID和其他杂项信息的人员表
  2. 许可证表格,其中包含要加入的ID和每人多条记录(10-15)
  3. 我的目标是让所有人获得蓝色许可证和白色许可证(例如)。

    使用:

    SELECT distinctrow person.ID AS client_ID, postcode, locality 
    FROM (person INNER JOIN licences ON person.ID = licences.client_ID)
    WHERE licence LIKE '%Blue%' **OR** licence LIKE '%White%'
    

    当然会给那些有两种情况的人带来回报。

    使用:

    SELECT distinctrow person.ID AS client_ID, postcode, locality 
    FROM (person INNER JOIN licences ON person.ID = licences.client_ID)
    WHERE licence LIKE '%Blue%' **AND** licence LIKE '%White%'
    

    当然不会返回任何结果(怎么可能?)。

    这是一个非常简化的例子,因为我在一个嵌套的JOIN中将5个表拉在一起,所有这些都有标准(进入40多个$ _GET变量!)......但这就是我被困住的地方。我在INNER JOIN中使用了AND而不是WHERE,结果没有任何变化。我喝了很多啤酒,但仍然没有变化:)

    我知道我揭示了我对基础知识缺乏了解,但我当然不需要将SELECT放在SELECT中?左或右加入,也许?

    我觉得我将要在这里学习一些基础知识,所以要把它打开!

4 个答案:

答案 0 :(得分:3)

SELECT  *
FROM    person p
WHERE   (
        SELECT  COUNT(DISTINCT licence)
        FROM    licences l
        WHERE   l.client_id = p.id
                AND l.licence IN ('white', 'blue')
        ) = 2

SELECT  DISTINCT p.*
FROM    person p
JOIN    licences l
ON      l.client_id = p.id
        AND l.licence IN ('white', 'blue')
GROUP BY
        p.id
HAVING  COUNT(DISTINCT licence) = 2

根据数据分布(每人拥有多少许可证),其中一个查询效率会更高。

答案 1 :(得分:2)

试试这个:

SELECT person.*
FROM person
WHERE EXISTS (SELECT 1 FROM licenses 
               WHERE licenses.client_ID = person.ID 
                 AND licence LIKE '%Blue%')
AND   EXISTS (SELECT 1 FROM licenses 
               WHERE licenses.client_ID = person.ID 
                 AND licence LIKE '%White%')

根据您的架构和表格大小,这可能会很慢,但

答案 2 :(得分:1)

听起来像INTERSECT会起作用。你可以选择所有蓝调INTERSECT选择所有白人。

SELECT distinctrow person.ID AS client_ID, postcode, locality 
FROM person INNER JOIN licences ON person.ID = licences.client_ID
WHERE licence LIKE '%Blue%'
INTERSECT
SELECT distinctrow person.ID AS client_ID, postcode, locality 
FROM person INNER JOIN licences ON person.ID = licences.client_ID
WHERE licence LIKE '%White%'

(或类似的东西。我对MySql不太熟悉。)

编辑:没关系,MySql不支持它。这就是我试图回答MySql问题所得到的

答案 3 :(得分:0)

由于许可证表格中的单独记录中都存在蓝色许可证和白色许可证,因此您需要将该表格加入两次,如下所示:

SELECT person.ID AS client_ID, postcode, locality 
FROM person 
JOIN licences l1 ON person.ID = l1.client_ID
JOIN licences l2 ON person.ID = l2.client_ID
WHERE l1.license LIKE '%Blue%' AND l2.license LIKE '%White%'