Mysql 对并集和限制的错误使用

Mysql 对并集和限制的错误使用,mysql,sql,union,Mysql,Sql,Union,我有一个庞大的SQL语句,升级到MySQL 5.7后出现以下错误: 对并集和限制的错误使用 这是初始查询: SELECT tx_wbfincas_domain_model_finca.*, helper.* FROM tx_wbfincas_domain_model_finca LEFT JOIN tx_wbfincas_domain_model_finca_searchhelper AS helper ON tx_wbfincas_domain

我有一个庞大的SQL语句,升级到MySQL 5.7后出现以下错误:

对并集和限制的错误使用

这是初始查询:

SELECT    tx_wbfincas_domain_model_finca.*,
          helper.*
FROM      tx_wbfincas_domain_model_finca
LEFT JOIN tx_wbfincas_domain_model_finca_searchhelper AS helper
ON        tx_wbfincas_domain_model_finca.uid = helper.finca_uid
WHERE     hidden=0
AND       deleted=0
AND       helper.persons =
          (
                 SELECT IF(Min(shelper.persons) IS NULL, 1000, Min(shelper.persons)) as tb1
                 FROM   tx_wbfincas_domain_model_finca_searchhelper                  AS shelper
                 WHERE  shelper.finca_uid = tx_wbfincas_domain_model_finca.uid limit 1
                 UNION
                          (
                                 SELECT max(shelper.persons)                        AS tb1
                                 FROM   tx_wbfincas_domain_model_finca_searchhelper AS shelper
                                 WHERE  shelper.finca_uid = tx_wbfincas_domain_model_finca.uid limit 1 )
                 ORDER BY tb1 ASC limit 1)
AND       uid IN
          (
                 SELECT uid_local
                 FROM   tx_wbfincas_finca_category_mm
                 WHERE  uid_foreign=4)
GROUP BY  uid
ORDER BY  min_price ASC ;

https://pastebin.com/H2eaNzJ6
我已经尝试插入更多括号,如下所示:

SELECT    tx_wbfincas_domain_model_finca.*,
          helper.*
FROM      tx_wbfincas_domain_model_finca
LEFT JOIN tx_wbfincas_domain_model_finca_searchhelper AS helper
ON        tx_wbfincas_domain_model_finca.uid = helper.finca_uid
WHERE     hidden=0
AND       deleted=0
AND       helper.persons =
          ((SELECT IF(Min(shelper.persons) IS NULL, 1000, Min(shelper.persons)) as tb1
                    FROM   tx_wbfincas_domain_model_finca_searchhelper                  AS shelper
                    WHERE  shelper.finca_uid = tx_wbfincas_domain_model_finca.uid limit 1 )
                 UNION
                 (SELECT max(shelper.persons) as tb1
                         FROM   tx_wbfincas_domain_model_finca_searchhelper AS shelper
                         WHERE  shelper.finca_uid = tx_wbfincas_domain_model_finca.uid limit 1 )
                 ORDER BY tb1 ASC limit 1)
AND       uid IN
          (SELECT uid_local
                 FROM   tx_wbfincas_finca_category_mm
                 WHERE  uid_foreign=4)
GROUP BY  uid
ORDER BY  min_price ASC ;

https://pastebin.com/mctaxTNL
但我又犯了一个错误:

您的SQL语法有错误;查看与您的MySQL服务器版本对应的手册,了解在“UNION”附近使用的正确语法


我在这里做错了什么?

如果您使用的是
limit
,则子查询周围需要括号。而且,
UNION
不是
SELECT
语法的一部分。所以你需要
选择。从带有子查询的
。因此,这可能会起作用:

 helper.persons = (SELECT tbl1
                   FROM ((SELECT IF(Min(shelper.persons) IS NULL, 1000, Min(shelper.persons)) as tb1
                          FROM tx_wbfincas_domain_model_finca_searchhelper shelper
                    WHERE shelper.finca_uid = tx_wbfincas_domain_model_finca.uid 
                          LIMIT 1
                         ) UNION 
                         (SELECT max(shelper.persons)                        AS tb1
                          FROM   tx_wbfincas_domain_model_finca_searchhelper shelper
                          WHERE shelper.finca_uid = tx_wbfincas_domain_model_finca.uid 
                          LIMIT 1
                         )
                        ) x
                 ORDER BY tb1 ASC 
                 LIMIT 1
                )

如果使用的是
limit
,则子查询周围需要括号。而且,
UNION
不是
SELECT
语法的一部分。所以你需要
选择。从带有子查询的
。因此,这可能会起作用:

 helper.persons = (SELECT tbl1
                   FROM ((SELECT IF(Min(shelper.persons) IS NULL, 1000, Min(shelper.persons)) as tb1
                          FROM tx_wbfincas_domain_model_finca_searchhelper shelper
                    WHERE shelper.finca_uid = tx_wbfincas_domain_model_finca.uid 
                          LIMIT 1
                         ) UNION 
                         (SELECT max(shelper.persons)                        AS tb1
                          FROM   tx_wbfincas_domain_model_finca_searchhelper shelper
                          WHERE shelper.finca_uid = tx_wbfincas_domain_model_finca.uid 
                          LIMIT 1
                         )
                        ) x
                 ORDER BY tb1 ASC 
                 LIMIT 1
                )

是的,我的第二次尝试是用更多的括号。 有了你的询问,我明白了

Unknown column 'tx_wbfincas_domain_model_finca.uid' in 'where clause'
您的第一个选择应该是“选择tb1”,而不是tbl1-我说的对吗


我是否也应该在子查询中加入tx\u wbfincas\u domain\u model\u finca

是的,我的第二次尝试是用了更多的括号。 有了你的询问,我明白了

Unknown column 'tx_wbfincas_domain_model_finca.uid' in 'where clause'
您的第一个选择应该是“选择tb1”,而不是tbl1-我说的对吗

我是否也应该在子查询中加入tx\u wbfincas\u domain\u model\u finca

我有一个解决方案: 在联合之前,我必须删除嵌套查询中的第一个限制

查询:

SELECT tx_wbfincas_domain_model_finca.*, helper.*   
FROM tx_wbfincas_domain_model_finca 
LEFT JOIN tx_wbfincas_domain_model_finca_searchhelper as helper 
ON tx_wbfincas_domain_model_finca.uid = helper.finca_uid 
WHERE hidden=0 
AND deleted=0 
AND helper.persons = 
    ( 
        SELECT IF(MIN(shelper.persons) IS NULL, 1000, MIN(shelper.persons)) AS tb1 
        FROM tx_wbfincas_domain_model_finca_searchhelper AS shelper 
        WHERE shelper.finca_uid = tx_wbfincas_domain_model_finca.uid 
        UNION 
            ( 
                SELECT MAX(shelper.persons) AS tb1 
                FROM tx_wbfincas_domain_model_finca_searchhelper AS shelper 
                WHERE shelper.finca_uid = tx_wbfincas_domain_model_finca.uid LIMIT 1 
            ) 
                ORDER BY tb1 ASC LIMIT 1 
    )

AND uid IN 
       (
           SELECT uid_local 
           FROM tx_wbfincas_finca_category_mm 
           WHERE uid_foreign=4
      ) 
GROUP BY uid 
ORDER BY min_price ASC 
我有一个解决办法: 在联合之前,我必须删除嵌套查询中的第一个限制

查询:

SELECT tx_wbfincas_domain_model_finca.*, helper.*   
FROM tx_wbfincas_domain_model_finca 
LEFT JOIN tx_wbfincas_domain_model_finca_searchhelper as helper 
ON tx_wbfincas_domain_model_finca.uid = helper.finca_uid 
WHERE hidden=0 
AND deleted=0 
AND helper.persons = 
    ( 
        SELECT IF(MIN(shelper.persons) IS NULL, 1000, MIN(shelper.persons)) AS tb1 
        FROM tx_wbfincas_domain_model_finca_searchhelper AS shelper 
        WHERE shelper.finca_uid = tx_wbfincas_domain_model_finca.uid 
        UNION 
            ( 
                SELECT MAX(shelper.persons) AS tb1 
                FROM tx_wbfincas_domain_model_finca_searchhelper AS shelper 
                WHERE shelper.finca_uid = tx_wbfincas_domain_model_finca.uid LIMIT 1 
            ) 
                ORDER BY tb1 ASC LIMIT 1 
    )

AND uid IN 
       (
           SELECT uid_local 
           FROM tx_wbfincas_finca_category_mm 
           WHERE uid_foreign=4
      ) 
GROUP BY uid 
ORDER BY min_price ASC 

如此大的代码转储需要一个问题陈述来回答。在我脑海中,我敢打赌我们至少可以摆脱一些嵌套子查询。。。联盟。。。选择?您期望的结果是什么?如此大的代码转储需要一个问题陈述来回答。在我脑海中,我敢打赌我们至少可以摆脱一些嵌套子查询。。。联盟。。。选择?你期望的结果是什么?