【问题标题】:Selection of lines from a multiple condition request从多条件请求中选择行
【发布时间】:2015-01-15 17:22:47
【问题描述】:

我有一个名为“proposition”的 MySQL 表,主键为“idProposition”,还有一个名为“needs”的表,其中包含“idProposition”和“idRequirement”列。我想得到链接需求都在 $requireList php 数组中的命题。

我试图这样做:

$req = "SELECT idProposition FROM proposition
        WHERE (SELECT idProposition FROM proposition
                 WHERE needs.idProposition = proposition.idProposition
                       AND idRequirement NOT IN($requireList))
          IS NULL";

但是当我提出请求时,出现以下错误:

#1242 - Subquery returns more than 1 row 

意味着它无法测试结果(在 $requireList 中没有需求的命题)是否为空,因为有多个结果。 如何测试内部 SELECT 是否提供结果?

感谢您的帮助。

【问题讨论】:

  • 为什么不只是 LIMIT 1?或者使用 JOINS。
  • 您的查询的FROM 子句中没有表needs。

标签: php mysql sql select where


【解决方案1】:

试试这个:

SELECT p.*
FROM proposition p
  INNER JOIN needs n ON n.idProposition = p.idProposition
WHERE idRequirement IN (1, 7, 9)    # blah, blah, blah, put your list here
GROUP BY p.idProposition
HAVING COUNT(idRequirement) = 3     # put the size of the list here

它的作用:它SELECTs 所有与列表中的要求相匹配的命题。仅链接一个需求或所有需求都没有关系。然后它GROUPs 那些行BY 命题。每个命题都会产生一行数据。然后它只保留这些行中的 HAVING 与列表大小相同数量的需求(即所有需求都存在)。

我没有测试它,但它应该可以工作。如果没有,只需将COUNT(idRequirement) 添加到SELECT 子句即可。

【讨论】:

  • 不起作用,因为例如,没有要求的命题不会被检测到,而它的所有要求都在列表中。
  • 我发现了一个基于你的非常肮脏但有效的解决方案:我在数据库中添加了所有命题的要求 0。 $requireList 从不包含 0。我使用了“HAVING COUNT(idRequirement)=1”,因此只剩下无法到达的条件。
【解决方案2】:

尝试使用

SELECT idProposition FROM proposition 
INNER JOIN needs on proposition.idProposition = needs.idproposition

而不是

SELECT idProposition FROM proposition
        WHERE (SELECT idProposition FROM proposition
                 WHERE needs.idProposition = proposition.idProposition

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-06
    • 2013-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多