我有一个简单的要求,但无法正确获取SELECT语句,因此它将提供所需的结果。
我有两张桌子: -
我的目标是让所有人获得蓝色许可证和白色许可证(例如)。
使用:
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中?左或右加入,也许?
我觉得我将要在这里学习一些基础知识,所以要把它打开!
答案 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%'