簡體   English   中英

大於運算符無法在查詢中工作

[英]Greater than operator not working in a query

誰能提出建議,為什么在此MySQL查詢中忽略大於運算符?

$sql = "SELECT *
FROM `items`
WHERE `short_description` LIKE '%".$term."%'
    OR `description` LIKE '%".$term."%'
    AND `quantity` > 0
ORDER BY year DESC, denomination ASC, description ASC $max";

我在可以正常使用的同一網站上進行了類似的查詢

$sql = "SELECT *
FROM `items`
WHERE `category` = '".$cat_id."'
    AND `quantity` > 0
ORDER BY year DESC, denomination ASC, description ASC;";

一切正常,除了第一個查詢的數量比較,它讓我感到困惑。

您應將“ OR和“ AND條件分組,並用括號括起來,

$sql = "SELECT * FROM `items` 
         WHERE  (`short_description` LIKE '%".$term."%' OR 
                 `description` LIKE '%".$term."%')  AND 
                  `quantity` > 0 
          ORDER BY year DESC, denomination ASC, description ASC $max";

跟進問題: $max是一個包含LIMIT子句的變量嗎?

作為一個旁注,查詢是脆弱的SQL Injection ,如果變量的值(一個或多個 )從外面走了進來。 請查看下面的文章,以了解如何防止它。 通過使用PreparedStatements您可以擺脫在值周圍使用單引號的麻煩。

"SELECT * FROM items WHERE (short_description LIKE '%".$term."%' OR description LIKE 
'%".$term."%') 
AND quantity > 0 
ORDER BY year DESC, denomination ASC, description ASC $max";

嘗試...您有一個Or條件,一個and條件。

嘗試

$sql = "SELECT *
FROM `items`
WHERE (`short_description` LIKE '%".$term."%'
    OR `description` LIKE '%".$term."%')
    AND `quantity` > 0
ORDER BY year DESC, denomination ASC, description ASC $max";

我認為您的OR陳述式就是問題。

它不會被忽略,只是您誤解了它的應用方式。 表達方式:

WHERE `short_description` LIKE '%".$term."%' (call this XX,)
OR `description` LIKE '%".$term."%'          (          YY,)
AND `quantity` > 0                           (      and ZZ.)

被解釋為:

where XX or (YY and ZZ)

而您可能想要的是:

where (XX or YY) and ZZ

因此,您必須重寫默認解釋,如下所示:

WHERE (`short_description` LIKE '%".$term."%' OR
       `description` LIKE '%".$term."%')
  AND `quantity` > 0

您的第二個查詢沒有此問題的原因是因為您沒有混合ANDOR


另外,盡管與您的特定問題無關),但您應非常警惕諸如like '%something%'的雙頭like子句。 它們是大小合適的表的真正性能殺手,並且有很多方法可以顯着提高性能。

在這種情況下,如果您的桌子很小,可能沒關系,但是要記住這一點。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM