【问题标题】:MySQL AND vs OR conditionMySQL AND vs OR 条件
【发布时间】:2013-11-09 08:08:49
【问题描述】:

我正在尝试从满足子表条件的主表中获取集合。我正在尝试的是:

SELECT main_table.* 
FROM main_table 
LEFT OUTER JOIN category_available ON main_table.id = category_available.main_table_id 
WHERE  category_available.category_id = 206 AND category_available.category_id = 207;

即使主表包含的行中的条目同时满足子表中的 AND 条件,我也没有得到任何结果。如果我用 AND 代替 OR,我会得到预期的结果,但查询需要满足 AND 条件。

category_available 是一个子表。它包含许多可以绑定到单个主表行的行。所以它可能包含两行包含 main_table id,一个 id 为 206,另一个 207。所以我需要返回满足这两个条件的 main_table 行。

【问题讨论】:

  • 一个东西怎么可能同时等于 206 和 207?
  • 为什么你认为查询需要满足and条件?
  • main_table.idcategory_available 表之间是否存在多对一关系?是否存在多对一的外键关系?

标签: mysql sql join conditional-statements


【解决方案1】:

或者是你想要的......这里的'and'条件永远不会正确

category_available.category_id = 206 AND category_available.category_id = 207

此语句可以简化为 where 206 = 207,它永远不会为真,也永远不会返回结果。一个字段怎么能同时等于206和207呢?

编辑:

这可能更接近您正在寻找的...有几种编写方式,如果它是一次性运行的脚本,我会用计数来接近它:

eggyal 打败了我...我的剧本是他几分钟前发布的内容的一面镜子。

【讨论】:

  • category_available 是一个子表。它包含许多可以绑定到单个主表行的行。所以它可能包含两行包含 main_table id,一个 id 为 206,另一个 207。所以我需要返回满足这两个条件的 main_table 行。
  • @sudopratt 在你的问题中澄清这一点
  • 啊,这更有意义。当您将单行连接到两行时,您会得到两行......在这种情况下,一个带有 206,一个带有 207。由于两者都没有,因此两者都不会返回。澄清你的问题,让我编辑答案
  • @Twelfth 我在问题中添加了该信息。
【解决方案2】:

您可以通过main_table的PK对记录进行分组,然后相应地过滤相应的组:

SELECT   m.* 
FROM     main_table m JOIN category_available c ON c.main_table_id = m.id
WHERE    c.category_id IN (206, 207)
GROUP BY m.id
HAVING   COUNT(DISTINCT c.category_id) = 2

如果category_available 表保证(main_table_id, category_id) 的唯一性,则可以通过使用COUNT(*) = 2 来避免代价高昂的DISTINCT 操作。

【讨论】:

    猜你喜欢
    • 2016-04-24
    • 2015-07-09
    • 2012-08-03
    • 1970-01-01
    • 1970-01-01
    • 2013-04-07
    • 1970-01-01
    • 1970-01-01
    • 2010-11-14
    相关资源
    最近更新 更多