选择不同的行当存在两列的逻辑或时

Selecting Distinct rows When there is a Logical OR with two columns

如标题所示,我有一个 MySQL 查询是这样的:

SELECT DISTINCT `friendly_url` FROM `post` WHERE `description` LIKE ? OR `heading` LIKE ? ORDER BY `friendly_url`

我在参数中提供了字符串“%”通配符,以便它可以用作搜索功能。然而,假设用户正在搜索像 'is' 这样的常用词,它同时出现在标题和描述中的相同 post 中。然后这个查询 returns 同样 post 两次。我不希望发生这种情况,因此 'DISTINCT'.

为什么会这样?我有什么办法可以让它按照我想要的方式工作吗?

查询未对同一行 return 两次。 WHERE 子句中的谓词针对每一行进行评估,并且该行是 returned,或者不是。 OR 条件的组合不会导致 MySQL 到 return 多次 "same row"。

如果您得到 friendly_url 的重复值,那么 post table 中有多个行具有与 friendly_url 相同的值。 (即 friendly_url 列在 post table 中 不是 唯一。)


您不必使用 DISTINCT 关键字从结果集中删除重复项。您可以删除 DISTINCT 关键字,并在 ORDER BY 子句之前添加 GROUP BY friendly_url


要识别 friendly_url 的 "duplicated" 值,以及有多少行具有相同的值:

  SELECT p.friendly_url
       , COUNT(1)
    FROM post p
   GROUP BY p.friendly_url
  HAVING COUNT(1) > 1