【问题标题】:Why EXCEPT function doesn't work? [duplicate]为什么 EXCEPT 功能不起作用? [复制]
【发布时间】:2018-06-10 05:55:56
【问题描述】:

我有下面这样的mysql查询:

$missingTypo = mysql_query("SELECT m.ID
                              FROM table1 AS m
                              LEFT JOIN table2 AS ut
                              ON ut.matchID = m.ID
                              WHERE data > '$now'
                          EXCEPT
                            SELECT m.ID
                              FROM table1 AS m
                              LEFT JOIN table2 AS ut
                              ON ut.matchID = m.ID
                              WHERE data > '$now' 
                              AND ut.typer = '$name'");

第一个状态查询返回 3 个结果 [10, 11, 12],第二个返回 1 个结果 [10]。整个查询的结果应该是 [11, 12] 但它不起作用。 var_dump 函数返回 false。 但是,如果我将“EXCEPT”交换为例如“UNION ALL”,它可以正常工作并给出 [10, 11, 12, 10]。

请帮忙。

【问题讨论】:

  • 不要使用已弃用且不安全的mysql_*-函数。它们自 PHP 5.5(2013 年)以来已被弃用,并在 PHP 7(2015 年)中完全删除。请改用 MySQLi 或 PDO。

标签: php mysql except


【解决方案1】:

正如其他答案所建议的那样,Mysql 不支持EXCEPT,但您可以使用NOT IN 谓词:

SELECT m.ID
FROM table1 AS m
LEFT JOIN table2 AS ut ON ut.matchID = m.ID
WHERE data > '$now'
  AND m.ID NOT IN(SELECT m2.ID
                  FROM table1 AS m2
                  INNER JOIN table2 AS ut ON ut.matchID = m.ID
                  WHERE data > '$now' 
                    AND ut.typer = '$name');

LEFT JOIN:

SELECT t1.ID
FROM
(
  SELECT m.ID
  FROM table1 AS m
  LEFT JOIN table2 AS ut ON ut.matchID = m.ID
  WHERE data > '$now'
) AS t1
LEFT JOIN
(
  SELECT m.ID
  FROM table1 AS m
  LEFT JOIN table2 AS ut ON ut.matchID = m.ID
  WHERE data > '$now' 
    AND ut.typer = '$name'
) AS t2 ON t1.ID = t2.ID
WHERE t2.ID IS NULL

【讨论】:

  • 非常感谢大家!第一个示例效果很好并且语法简单。谢谢!
  • @ŁukaszMikowski - 不客气,如果您觉得有帮助,请接受答案。
  • 我还有一个问题。如果我要选择多于 1 列怎么办?
  • @ŁukaszMikowski ,要选择额外的列,您可以在选择中列出额外的列。
  • @ŁukaszMikowski - 你可以用SELECT m.ID 代替SELECT m.*
【解决方案2】:

MySQL 不支持 EXCEPT,请改用 WHERE NOT

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-08
    • 1970-01-01
    • 1970-01-01
    • 2013-09-22
    • 1970-01-01
    相关资源
    最近更新 更多