2016-12-15 67 views
0

該查詢需要與「修正」欄的最高值出各組「sheet_ID」列的返回所有行。它工作正常,當我不做OR語句,但我需要能夠使用它們。輸入字段用於「Item Numbers」,or語句需要從可能的10列中提取該數字。MySQL查詢返回的行數多於預期,我如何只返回每個組中一列的最高值?

這裏是我的查詢語句:

SELECT item_no, item_no1, item_no2, item_no3, item_no4, item_no5, item_no6, 
     item_no7, item_no8, item_no9, style, vendor_code, pgc, buyer, brand, 
     product_name, sheet_ID, revision, id 
FROM product_sheets 
WHERE item_no LIKE '$value' or item_no1 LIKE '$value' or 
     item_no2 LIKE '$value' or item_no3 LIKE '$value' or 
     item_no4 LIKE '$value' or item_no5 LIKE '$value' or 
     item_no6 LIKE '$value' or item_no7 LIKE '$value' or 
     item_no8 LIKE '$value' or item_no9 LIKE '$value' AND 
     revision IN (SELECT MAX(revision) 
        FROM product_sheets 
        GROUP BY sheet_ID 
       ); 
+0

見正常化。任何時候你列舉了列,警報響鈴應該開始響起。任何其他建議坦率地說是荒謬的。 – Strawberry

回答

0

您必須使用括號日or條件,沒有他們,只有最後一個條件item_no9 LIKE '$value'與AND運算符的IN條件有關。

WHERE (item_no LIKE '$value' or item_no1 LIKE '$value' or 
     item_no2 LIKE '$value' or item_no3 LIKE '$value' or 
     item_no4 LIKE '$value' or item_no5 LIKE '$value' or 
     item_no6 LIKE '$value' or item_no7 LIKE '$value' or 
     item_no8 LIKE '$value' or item_no9 LIKE '$value' 
    ) 

此外,將IN條件更改爲以下。
你不想修訂,是不是它的sheet_ID的最大修訂,以配合另一sheet_ID的最高版本。

 AND (sheet_ID,revision) IN (SELECT sheet_ID,MAX(revision) 
            FROM product_sheets 
            GROUP BY sheet_ID 
           ); 
0

取而代之的是:

revision IN (SELECT MAX(revision) 
       FROM product_sheets 
       GROUP BY sheet_ID 
      ); 

你想要一個相關子查詢。在你的情況下,你可以這樣寫:

revision = (SELECT MAX(ps2.revision) 
       FROM product_sheets ps2 
       WHERE ps2.sheet_ID = product_sheets.sheet_ID 
      ); 

但是,我強烈建議你在外部查詢中使用表別名。

您還需要修復的括號中where

WHERE (item_no LIKE '$value' or item_no1 LIKE '$value' or 
     item_no2 LIKE '$value' or item_no3 LIKE '$value' or 
     item_no4 LIKE '$value' or item_no5 LIKE '$value' or 
     item_no6 LIKE '$value' or item_no7 LIKE '$value' or 
     item_no8 LIKE '$value' or item_no9 LIKE '$value' 
    ) AND 
     revision = (SELECT MAX(ps2.revision) 
        FROM product_sheets ps2 
        WHERE ps2.sheet_ID = product_sheets.sheet_ID 
       ); 

如果$value不使用通配符,這是更簡單地寫爲:

where '$value' in (item_no, item_no1, item_no2, . . .) and 
     revision = (SELECT MAX(ps2.revision) 
        FROM product_sheets ps2 
        WHERE ps2.sheet_ID = product_sheets.sheet_ID 
       ); 

而且,除了關於規範化的評論(強烈建議),您還需要了解如何使用查詢參數將值傳遞給查詢。