【问题标题】:Search MySql db with multiple "WHERE IN" and "OR" not working使用多个“WHERE IN”和“OR”搜索 MySql db 不起作用
【发布时间】:2013-10-14 18:26:30
【问题描述】:

假设我有这样一张桌子:

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

我已经有以下 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 等?

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

【问题讨论】:

    标签: mysql sql group-by where


    【解决方案1】:

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

    【讨论】:

    • 我正在尽最大努力解决这个问题,但无法让它工作..所以我有一个用户输入的用户表单:记录可以是性别 ='男性|女性'和城市'马德里|阿姆斯特丹'和眼睛颜色='灰色'。所以,换句话说:数据库应该只返回眼睛颜色=灰色和城市马德里或阿姆斯特丹和性别=男性或女性的ID。我已经尝试了这两个答案,但无法让它工作!你的答案(悲观)有 OR 而我需要 AND(我认为)
    • k...等等。你想要所有现在住在马德里或阿姆斯特丹的灰色眼睛的男性和女性,对吧? (我有灰色的眼睛,但我住的地方不好玩)
    • :-) 是的,我的意思是只有要返回的记录是:(男性或女性)灰眼睛的人(无论是在马德里还是在西班牙)
    • 是的!这似乎工作!我选择选项 3(计数> 3)。我现在必须去,但明天晚上我会尝试完全实施你的答案。非常感谢您提供清晰且有据可查的答案!如前所述,我明天会回来并让你知道。我觉得你的方式很大(批准);-) 谢谢!
    • 我写错了。 >3...我改了。应该是 =3.... 抱歉......它是 >=3 但这是不必要的,我暂时删除了错误的符号......
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-09-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-26
    • 1970-01-01
    • 2013-09-11
    相关资源
    最近更新 更多