使用多个“搜索MySql数据库”;“在哪里?”;及;或;不起作用

使用多个“搜索MySql数据库”;“在哪里?”;及;或;不起作用,mysql,sql,group-by,where,Mysql,Sql,Group By,Where,假设我有一张这样的桌子: 假设我的用户输入他希望看到性别为男性且eyecolor=灰色的所有记录 我已经有了以下SQL: SELECT User, question, answer FROM [Table] WHERE User IN ( SELECT User FROM [table] WHERE (question, answer) IN ( ('gender', 'male'), ('eyecolor', 'grey') ) ) GROUP

假设我有一张这样的桌子:

假设我的用户输入他希望看到性别为男性且eyecolor=灰色的所有记录

我已经有了以下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)
但是,如果我的用户希望查看
(性别=男性或性别=女性)和eyecolor=灰色的所有记录,该怎么办?我将如何格式化上述sql查询以使其能够找到它

(请记住,这是一个搜索表单,因此eyecolor和gender只是用于搜索的几个字段;我需要能够使用和/或combo搜索)

我在想,我唯一能让它发挥作用的方法是:

SELECT User
FROM [table]
WHERE (gender = male OR gender = female) AND eyecolor = blue
我的php必须构建查询,这样如果用户输入更多字段,查询就会扩展为更多的
WHERE
,等等

我一直在到处找,但没能把它用上。。无可否认,我并不是世界上最伟大的

其中
2
是嵌套的
where
语句中的条件数。如果您自己运行嵌套的select,它将为您提供符合条件的ID的唯一列表。outer语句允许查询返回符合这些条件的ID的所有记录

我编辑这个是因为。。。。我以前错了


k、

对于此查询,我们将返回一行,该行与任何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;
然后我们添加groupby,这样我们就可以看到每个用户返回了多少行以及它们满足了多少条件(
count(*)

具有计数(ID)=3的
是使此查询工作的原因。我们只需要返回3行的ID,因为我们有3个条件

。。。。我们不能使用
,因为该表中的任何行在同一时间都不会满足其中一个以上的条件<代码>问题
不能同时显示性别、眼睛颜色和城市。这与您的表格布局有关。这座城市永远不会同时是马德里和阿姆斯特丹<代码>和
不会给我们任何东西。所以通过使用具有和或的
。。。我们可以做一些快乐的事


继续切线。。。。如果您的桌子如下所示:

ID      gender      eyecolor       city         
---------------------------------------------
100     male        blue           madrid
200     female      grey           amsterdam
300     male        brown          somewhere
你会使用
,因为

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'和回答('male','femal')
你确切地说明了你的意思,而不是假设某些信息只是一个问题的有效答案

我正在尽我最大的努力想办法解决这个问题,但没法使它发挥作用。。所以我有一个用户输入的用户表单:记录可以是性别=‘男|女’和城市‘马德里|阿姆斯特丹’以及eyecolor=‘灰色’。因此,换句话说:db应该只返回id,其中eyecolor=灰色,city或madrid或amsterdam,gender=男性或女性。我尝试了这两种答案,但都无法实现!你的回答(阴郁的)已经或在我需要的时候(我认为)可以。。。等等你会吸引所有的灰色眼睛的男性和女性,他们现在住在马德里或阿姆斯特丹,对吗?(我有一双灰色的眼睛,但我不住在任何好玩的地方):-)是的,我的意思是只有(男性或女性)有灰色眼睛的记录才会被退回(马德里或西班牙)是的!!这似乎奏效了!我选择选项3(计数大于3)。我现在得走了,但明天晚上我会尽力把你的答案完全落实。感谢您的明确和详细的回答!如前所述,我明天会回来,并会让你知道。我感到一个巨大的赞成(赞成)正在向你走来;-)谢谢我写错了<代码>>3
。。。我改了。它应该是
=3
。。。。很抱歉它是
=3
,但这是不必要的,我删除了错误的符号一秒钟。。。
ID      gender      eyecolor       city         
---------------------------------------------
100     male        blue           madrid
200     female      grey           amsterdam
300     male        brown          somewhere
select  * 
from    table 
where   gender in ('male','female') and
        city in ('madrid','amsterdam') and 
        eyecolor = 'grey'
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;