使用WHERE,AND,&或者在同一MySQL查询帮助中

时间:2011-01-09 21:05:40

标签: php mysql

此查询是否有效?它效率最高吗?

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;

注意:postintolocation的值将包含在PHP数组中,因此如果这样可行,我计划循环其数组以生成查询项。有没有办法将整个数组传递给MySQL?而且,这两个条件有可能很长(十几个值)。还有更好的方法吗?

特别是我的问题是:

AND (`postinto` = 'cat1' OR `postinto` = 'cat2')
AND (`location` = 'loc1' OR `location` = 'loc2')

可能值的示例是“社区|群组”,“买卖 - 交易|电子产品”,其中|是类别之前,|之后是子类别。如果我正在搜索整个类别,我想将查询的那一部分更改为:

AND (`postinto` LIKE 'category|%' OR `postinto` = 'this'

我有全文搜索的正确索引,我的问题是关于OR子句。您是否可以在一个查询中使用OR的最大次数?这种语法是否正确?

由于

2 个答案:

答案 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退休并且头发齐全!) 运气最好!