http://sqlfiddle.com/#!2/2e112/1/0
select *
from stuff
where ID in (
select ID
from stuff
where (question='gender' and answer in ('male','female')) or
(question='eyecolor' and answer='grey')
group by ID
having count(ID)=2
)
其中2
是嵌套where
语句中的条件数。如果您自己运行该嵌套选择,它只会为您提供适合条件的不同 ID 列表。外部语句允许查询返回符合这些条件的 ID 的所有记录。
我编辑这个是因为....我以前错了
k... http://sqlfiddle.com/#!2/2f526/1/0
select *
from stuff
where (question='gender' and answer in ('male','female')) or
(question='eyecolor' and answer='grey') or
(question='city' and answer in ('madrid','amsterdam'))
对于此查询,我们返回与任何 ID 的任何条件匹配的一行。只有满足其中至少一个条件的 ID 才会出现在结果中。
select ID, count(*) as matches
from stuff
where (question='gender' and answer in ('male','female')) or
(question='eyecolor' and answer='grey') or
(question='city' and answer in ('madrid','amsterdam'))
group by ID;
然后我们添加分组依据,这样我们就可以看到每个用户返回了多少行以及他们满足了多少条件(count(*)
)。
select ID
from stuff
where (question='gender' and answer in ('male','female')) or
(question='eyecolor' and answer='grey') or
(question='city' and answer in ('madrid','amsterdam'))
group by ID
having count(ID)=3;
这having count(ID)=3;
就是使此查询起作用的原因。我们只想要返回 3 行的 ID,因为我们有 3 个条件。
并且....我们不能使用and
,因为该表中的任何行都不会同时满足多个条件。 question
不能同时是性别、眼睛颜色和城市。它与您的表格布局有关。这座城市永远不会同时是马德里和阿姆斯特丹……and
不会给我们任何东西。所以...通过使用having
和or
...我们可以做一些快乐的事情...?
并切线......如果你的桌子看起来像这样:
ID gender eyecolor city
---------------------------------------------
100 male blue madrid
200 female grey amsterdam
300 male brown somewhere
你会用and
,因为....
select *
from table
where gender in ('male','female') and
city in ('madrid','amsterdam') and
eyecolor = 'grey'
但你的桌子是一张特别的桌子,不想那样做,因为你真的不应该为每个问题都有一列......如果他们改变了怎么办,或者如果你添加 20 怎么办?那将很难维护。
和....
select ID
from stuff
where question in ('gender','eyecolor','city') and
answer in ('male','female','grey','madrid','amsterdam')
group by ID
having count(ID)=3;
也有效,但我真的会谨慎,因为..问题和答案应该保持一致并明确,因为....如果它是约会服务怎么办?并且male
可能是一个人自己的性别或他们想要约会的性别的答案,通过这样做question='gender' and answer in ('male','female')
,您可以准确地说明您的意思,而不是假设某些信息只是一个问题的有效答案。