2017-10-25 11 views
0

を制限する私は、大規模なSQLステートメントを持っているとMySQL 5.7にアップグレードした後、私は次のエラーを取得する:間違った使い方や

incorrect usage of union and limit

これは最初のクエリです:

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 

しかし、私は別のエラーが表示されます。

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'UNION'

私はここで間違っていますか?

+0

コードダンプこの大は釈明する問題文を必要とします。私の頭の上から、私はそれらのネストしたサブクエリの少なくともいくつかを取り除くことができると確信しています。 –

+0

この選択でアーカイブをしようとしています...連合...選択しますか?あなたは結果として何を期待していますか? – BrenoQ

答えて

0

limitを使用している場合は、サブクエリの周りにかっこが必要です。また、UNIONSELECT構文の一部ではありません。 。 。サブクエリでSELECT . . . FROMが必要です。だからこれはうまくいくかもしれません:

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

はい、私の2回目の試みは、より多くのかっこを持っていました。私は右だ - 私は

Unknown column 'tx_wbfincas_domain_model_finca.uid' in 'where clause' 

を取得し、あなたのクエリを使用して はあなたの最初の選択は、「TB1を選択」ではなくTBL1すべきですか?

サブクエリのtx_wbfincas_domain_model_fincaにも参加する必要がありますか?

0

私には解決策があります: ユニオンの前にネストされたクエリの最初の制限を削除する必要がありました。

問合せ:

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 
関連する問題