2016-12-15 69 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 
       ); 

而且,除了关于规范化的评论(强烈建议),您还需要了解如何使用查询参数将值传递给查询。