MySQL — SQL 语法错误(WHERE IN UNION)

Posted

技术标签:

【中文标题】MySQL — SQL 语法错误(WHERE IN UNION)【英文标题】:MySQL — Error in your SQL syntax (WHERE IN UNION) 【发布时间】:2011-01-14 19:51:36 【问题描述】:
SELECT * 
FROM `SC_products` 
WHERE `productID` 
IN (
    (
        SELECT `productID` 
        FROM `SC_product_options_set` 
        LEFT JOIN `SC_products_opt_val_variants` ON `SC_product_options_set`.`variantID` = `SC_products_opt_val_variants`.`variantID` 
        WHERE `SC_products_opt_val_variants`.`optionID` = '14'
        GROUP BY `SC_product_options_set`.`productID` 
        ORDER BY `SC_products_opt_val_variants`.`sort_order` ASC 
    )
    UNION ALL
    (
        SELECT `productID` 
        FROM `SC_product_options_values` 
        WHERE `SC_product_options_values`.`optionID` = '14'
        ORDER BY `SC_product_options_values`.`option_value_ru` ASC 
    )
)
GROUP BY `SC_products`.`productID` 
LIMIT 0 , 30

ERROR №1064 - 您的 SQL 语法有错误;检查与您的 mysql 服务器版本相对应的手册,以在第 7 行的 'UNION ALL ( SELECT productID FROM SC_product_options_values WHERE `SC_produ' 附近使用正确的语法

请帮忙。

【问题讨论】:

【参考方案1】:

试试这个:

SELECT * 
FROM   `sc_products` 
WHERE  `productid` IN (
                     SELECT `productid` 
                        FROM   `sc_product_options_set` 
                               LEFT JOIN `sc_products_opt_val_variants` 
                                 ON `sc_product_options_set`.`variantid` = 
                                    `sc_products_opt_val_variants`.`variantid` 
                        WHERE  `sc_products_opt_val_variants`.`optionid` = '14' 
                        GROUP  BY `sc_product_options_set`.`productid` 
                       UNION ALL 
                       SELECT `productid` 
                        FROM   `sc_product_options_values` 
                        WHERE  `sc_product_options_values`.`optionid` = '14' 
                                            ) 
GROUP  BY `sc_products`.`productid` 
LIMIT  0, 30  

P.S:您的子查询中不需要 ORDER BY,因为它位于 IN 子句中

【讨论】:

谢谢,Cyber​​nate。我会试试的。【参考方案2】:

IIRC,您必须将 ORDER 子句放在您正在联合的查询之外。如果这样做,则需要确保在每个待联合查询中选择这些列,以便在获得完整记录集后对它们进行排序。

之后,您需要将这些结果包装在另一个 SELECT 层中,这样您的 IN 比较才会起作用。

【讨论】:

我试试这个(在 UNION 中没有 GROUP 和 ORDER): SELECT * FROM SC_products WHERE productID IN ( ( SELECT productID FROM SC_product_options_set LEFT JOIN SC_products_opt_val_variants ON SC_product_options_set .variantID = SC_products_opt_val_variants.variantID WHERE SC_products_opt_val_variants.optionID = '14' ) UNION ALL (SELECT productID FROM SC_product_options_values WHERE SC_product_options_values.SC_product_options_values.@98765433) GROUP BY SC_products.productID LIMIT 0 , 30 但我在同一行仍然有问题 当我尝试调试这类事情时,我通常会独立运行每个内部查询,以验证它们的语法和组合是否正确。一旦我确定了我的每个组件,那么我在将它们组合在一起时遇到的任何问题都会更容易解决。看起来@Cyber​​nate 在这里已经涵盖了您,但是如果您将来遇到类似的问题,这种调试技术可能会在将来为您节省一些痛苦。 =) Kyle Humfeld,我一开始尝试请求 UNION 块,没有问题。感谢您的建议。

以上是关于MySQL — SQL 语法错误(WHERE IN UNION)的主要内容,如果未能解决你的问题,请参考以下文章

mysql查询语句提示Unknown column 'zp' in 'where clause',求解!

SQL WHERE NOT...IN 与 WHERE ... NOT IN

MySQL SELECT WHERE IN LIST 和 NOT IN LIST 在同一 SQL 中

mysql 的 Unknown column '6' in 'order clause' 这是啥错误啊!! 高手们帮个忙啊!!!

在MySQL数据库中使用多个WHERE子句值更新多个列值时出现错误。

Where() in (select) H2