我在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,一旦我弄清楚它就会再次出现。
答案 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
这里重要的是使用括号分隔您的两个基本条件:
title
或fulltext
答案 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您的查询; 显示警告;