簡體   English   中英

MySQL查詢返回的行比預期的多,我如何僅從每個組返回一列的最大值?

[英]MySQL query returns more rows than intended, how do i only return the highest value of one column from each group?

該查詢需要返回“ sheet_ID”列的每組中具有“ revision”列最高值的所有行。 當我不執行OR語句但我需要能夠使用它們時,它會很好地工作。 輸入字段用於“項目編號”,or語句需要從可能的10列中拉出該編號。

這是我的查詢語句:

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
                  );

代替這個:

 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
                 );

並且,除了有關規范化的注釋(強烈建議)外,您還需要學習有關使用查詢參數將值傳遞給查詢的知識。

因此必須將日方括號or條件,沒有他們只有最后一個條件item_no9 LIKE '$value'與一個與運營商相關的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
                                  );

暫無
暫無

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

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