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

时间:2013-09-19 17:17:09

标签: php mysql

我在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.有没有人看到查询可能出错。如果您需要更多信息,请告诉我。

P.S。我最初设置这个设置使用RLIKE,一旦我弄清楚它就会再次出现。

3 个答案:

答案 0 :(得分:4)

您的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. 检查位置

答案 1 :(得分:1)

由于operator precedence,您的查询正在按以下方式处理:

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子句的位置添加括号。

答案 2 :(得分:0)

提示下次运行这些查询。 然后你可以看到优化器如何重写你的查询以及你的结果出错的原因。

请注意,有时SHOW WARNINGS中显示的查询并不总是有效的SQL,通常情况下是IN或NOT EXISTS subquerys

EXPLAIN EXTENDED您的查询; 显示警告;