0

假设我有一个这样的表:

在此处输入图像描述

假设我的用户输入他想查看所有性别为男性且眼睛颜色 = 灰色的记录。

我已经为此准备了以下 SQL:

SELECT User, question, answer FROM [Table] WHERE User IN (
    SELECT User FROM [table] WHERE (question, answer) IN (
        ('gender', 'male'),
        ('eyecolor', 'grey')
    )
)
GROUP BY User
HAVING count(distinct question, answer) = 2)

但是,如果我的用户想要查看所有记录(gender = male OR gender = female) AND eyecolor = grey怎么办?我将如何格式化上述 sql 查询以使其能够找到它?

(请记住,这是一个搜索表单,所以眼睛颜色和性别只是用于搜索的几个字段;我需要能够使用和/或组合进行搜索)

我在想我能让这个工作的唯一方法是:

SELECT User
FROM [table]
WHERE (gender = male OR gender = female) AND eyecolor = blue

我的 php 必须构建查询,以便如果用户输入更多字段,查询会扩展为更多WHERE等?

我一直在寻找,但无法让它发挥作用.. 诚然,我不是世界上最伟大的。

4

1 回答 1

0

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不会给我们任何东西。所以...通过使用havingor...我们可以做一些快乐的事情...?


并切线......如果你的桌子看起来像这样:

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'),您可以准确地说明您的意思,而不是假设某些信息只是一个问题的有效答案。

于 2013-10-14T18:49:27.173 回答