web-dev-qa-db-ja.com

MySql:#1221-UNIONおよびORDER BYの誤った使用

投稿の配列内の各投稿の最新の3つのコメントを取得することを目的とした次のクエリがあります。

SELECT * FROM comment AS tbl WHERE sscm_id IN 
(
  SELECT sscm_id FROM comment AS t1 WHERE t1.sscm_oid = 4 
    ORDER BY t1.sscm_id DESC LIMIT 3
  UNION  ALL
  SELECT sscm_id FROM comment AS t2 WHERE t2.sscm_oid = 3 
    ORDER BY t2.sscm_id DESC LIMIT 3
)

これは私に次のエラーを与えます:

1221-UNIONおよびORDER BYの誤った使用法

一部の検索とグーグルは、各サブクエリの周りに()を配置することでこの問題を解決できる可能性があることを示唆しているようですが、クエリを

SELECT * FROM comment AS tbl WHERE sscm_id IN
(
  (SELECT sscm_id FROM comment AS t1 WHERE t1.sscm_oid = 4 
     ORDER BY t1.sscm_id DESC LIMIT 3)
  UNION  ALL
  (SELECT sscm_id FROM comment AS t2 WHERE t2.sscm_oid = 3 
     ORDER BY t2.sscm_id DESC LIMIT 3)
)

しかし、これは私に次のエラーを与えます:

1064-SQL構文にエラーがあります。 4行目の「UNION ALL(SELECT sscm_id FROM bpsocial_comment AS t2 WHERE t2.sscm_oid = 3 OR」の近くで使用する正しい構文については、MySQLサーバーのバージョンに対応するマニュアルを確認してください。

それで、サブクエリでORDER BYと組み合わせてUNIONを機能させるにはどうすればよいですか?

ありがとうR

2
user13955

IN / LIMIT制限とUNION / ORDER BY構文要件を渡す方法はいくつかあります。

Unionを派生テーブルでラップします。

SELECT * FROM comment AS tbl WHERE sscm_id IN
  ( SELECT sscm_id
    FROM     
      ( ( SELECT sscm_id FROM comment AS t1 WHERE t1.sscm_oid = 4 
          ORDER BY t1.sscm_id DESC LIMIT 3)
      UNION  ALL
        ( SELECT sscm_id FROM comment AS t2 WHERE t2.sscm_oid = 3 
          ORDER BY t2.sscm_id DESC LIMIT 3)
      ) AS tmp 
  ) ;

WHERE / INの代わりにJOINを使用:
UNION ALLの代わりに[UNIONが必要です。重複を避けるためです。

SELECT tbl.* 
FROM comment AS tbl 
    JOIN 
        ( ( SELECT sscm_id FROM comment AS t1 WHERE t1.sscm_oid = 4 
            ORDER BY t1.sscm_id DESC LIMIT 3)
        UNION 
          ( SELECT sscm_id FROM comment AS t2 WHERE t2.sscm_oid = 3 
            ORDER BY t2.sscm_id DESC LIMIT 3)
        ) AS tmp 
      ON tmp.sscm_id = tbl.sscm_id ;
1
ypercubeᵀᴹ