【问题标题】:MySQL — Error in your SQL syntax (WHERE IN UNION)MySQL — SQL 语法错误(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' 附近使用正确的语法

请帮忙。

【问题讨论】:

    标签: mysql union


    【解决方案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 块,没有问题。感谢您的建议。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-11
    • 1970-01-01
    相关资源
    最近更新 更多