为什么我的 MySQL 查询返回带有 IN 值的错误数据


Why is my MySQL query returning wrong data with IN values

我正在用PHP运行一个查询,我得到了很多结果。 下面是查询:

mysql> SELECT `location` FROM `listings` WHERE `fulltext` LIKE '%a%' OR `title` LIKE
'%a%' AND location IN(33702,33709,33714,33716,33760,33762,33771,33773,33777,33781,33782)
ORDER BY `date` DESC 'g

这是我得到的CMD结果,它与我在PHP运行中获得的结果完全匹配:

+----------+
| location |
+----------+
|    78787 |
|    33782 |
|    33782 |
|    98102 |
|    33782 |
|    33782 |
|    33782 |
|    33782 |
|    33782 |
|    56564 |
|    44569 |
|    33782 |
|    33782 |
+----------+
13 rows in set (0.00 sec)

如您所见,我不应该得到 78787,98102,56564 或 44569。 有没有人看到查询可能出了什么问题。 如果您需要更多信息,请告诉我。

附言我最初设置了这个来使用 RLIKE,一旦我弄清楚了这一点,它就会再次出现。

看起来OR的优先级不正确。尝试:

SELECT `location` FROM `listings` WHERE (`fulltext` LIKE '%a%' OR `title` LIKE '%a%') AND location IN(33702,33709,33714,33716,33760,33762,33771,33773,33777,33781,33782) ORDER BY `date` DESC

这里重要的是使用括号来分隔您的两个基本条件:

  1. 检查titlefulltext
  2. 查看位置

由于运算符优先级,您的查询将按如下方式处理:

SELECT `location`
FROM `listings`
WHERE `fulltext` LIKE '%a%'
  OR (
       `title` LIKE '%a%'
    AND LOCATION IN(33702,33709,33714,33716,33760,33762,33771,33773,33777,33781,33782)
  )
ORDER BY `date` DESC

我不认为这是你想要的。尝试在要正确评估WHERE子句的位置添加括号。