此查询是否有效?它效率最高吗?
SELECT * FROM `posts`
WHERE MATCH (`title`, `body`)
AGAINST ('search terms' IN BOOLEAN MODE)
AND `price` BETWEEN '100' AND '1000'
AND (`postinto` = 'cat1' OR `postinto` = 'cat2')
AND (`location` = 'loc1' OR `location` = 'loc2')
ORDER BY `id` DESC
LIMIT 0, 100;
注意:postinto
和location
的值将包含在PHP数组中,因此如果这样可行,我计划循环其数组以生成查询项。有没有办法将整个数组传递给MySQL?而且,这两个条件有可能很长(十几个值)。还有更好的方法吗?
特别是我的问题是:
AND (`postinto` = 'cat1' OR `postinto` = 'cat2')
AND (`location` = 'loc1' OR `location` = 'loc2')
可能值的示例是“社区|群组”,“买卖 - 交易|电子产品”,其中|
是类别之前,|
之后是子类别。如果我正在搜索整个类别,我想将查询的那一部分更改为:
AND (`postinto` LIKE 'category|%' OR `postinto` = 'this'
我有全文搜索的正确索引,我的问题是关于OR子句。您是否可以在一个查询中使用OR的最大次数?这种语法是否正确?
由于
答案 0 :(得分:5)
实际上有。 IN语句可以帮助你。
您的查询将变为如下:
SELECT * FROM `posts`
WHERE MATCH (`title`, `body`)
AGAINST ('search terms' IN BOOLEAN MODE)
AND `price` BETWEEN '100' AND '1000'
AND `postinto` IN ('cat1', 'cat2')
AND `location` IN ('loc1', 'loc2')
ORDER BY `id` DESC
LIMIT 0, 100;
答案 1 :(得分:0)
您可以根据需要在WHERE中使用AND和OR,但为了保持理智,您需要遵守一些简单的规则。
1)不要混合它们,使用WHERE AND OR AND构造查询可能会有效但结果将是不可预测的,结果集可能包含同一记录的多个实例! (你实际上是将OR结构变成了一个EITHER!
2)我建议始终将所有OR语句放在任何AND语句之前。您将更容易理解并为其他任何人维护。
3)这可能不是必需的,但我总是尽可能将OR语句括在括号中。
我维护一个Sports数据库并运行一些可以在select中有多个选项的查询。
希望以下示例将简化说明。
//使查询检索单打游戏集。
$query = "SELECT * from Games WHERE Season = '$season'
AND GameNo < 8
OR Player1 = '$playerName' ORDER by MatchNo ASC";
$result = @mysql_query($query); // Run the query.
$num = mysql_num_rows($result);
这将运行,它在语法上是正确的,但结果将是不可预测的! 如果在这些情况下你希望在AND之后输入OR,那么你需要“和”OR。
//使查询检索单打游戏集。(这是正确的)
$query = "SELECT * from Games WHERE (Player1 = '$playerName'
OR Player3 = '$playerName') AND Season = '$season'
AND GameNo < 8 ORDER by MatchNo ASC";
$result = @mysql_query($query); // Run the query.
$num = mysql_num_rows($result);
这将运行并生成一个玩家参与的单打游戏列表。
以下是与AND之后的OR相同的声明。请注意,您需要AND OR到声明的结尾。
//进行查询以检索单曲游戏集。(这也是正确的)
$query = "SELECT * from Games WHERE Season = '$season'
AND GameNo < 8 AND (Player1 = '$playerName'
OR Player3 = '$playerName') ORDER by MatchNo ASC";
$result = @mysql_query($query); // Run the query.
$num = mysql_num_rows($result);
这将运行并生成一个玩家参与的单打游戏列表。
最后举几个例子,为什么我更喜欢OR首先
$query = "SELECT * from Games WHERE (Player1 = '$playerName'
OR Player2 = '$playerName' OR Player3 = '$playerName'
OR Player4 = '$playerName') AND Season = '$season'
AND GameNo > 7 ORDER by MatchNo ASC";
$result = @mysql_query($query); // Run the query.
$num = mysql_num_rows($result);
这将生成一个结果集,其中包含玩家参与的所有联赛双打。无论是作为主场1或2,还是距离3或4球员。
使用多个单独的OR语句生成查询。然后在OR之间放置一个AND 语句。
$query = "SELECT * from CupGames WHERE (Player1 = '$playerName'
OR Player2 = '$playerName' OR Player3 = '$playerName'
OR Player4 = '$playerName' OR Player5 = '$playerName'
OR Player6 = '$playerName') AND (CupID = 'CS' OR CupID = 'ND')
AND Season = '$season' AND GameNo < 4 ORDER by CupRound ASC";
$result04 = @mysql_query($query); // Run the query.
$num = mysql_num_rows($result04);
这将产生一个结果集,其中包含玩家参与的所有Cup三元组。无论是作为本垒打1,2或3,还是远离玩家4,5或6。 两个选中的杯子。选定赛季的CS(加冕盾)或ND(诺曼日杯)。
如果您想保留头发,我建议遵循这些规则。 (我已从IT退休并且头发齐全!) 运气最好!