• ベストアンサー

複数のSELECT文の結合について

$sql = "(SELECT * FROM hospytal WHERE shochi LIKE \"%$keyword%\") UNION (SELECT * FROM hospytal order by kuchikomi desc);"; // 口コミ数の降順 このSQL文は間違っているでしょうか。 やりたいことは、hospytalテーブルのshochiカラムでキーワードを含むものを、 降順にソートしたいのですが。 どうすればちゃんと動作するのか、ご教授お願い致します。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.3

>このSQL文は間違っているでしょうか。 間違っています。 あるテーブルに、IDと言うフィールドがあり、IDが1~10の10個のレコードが入っているとします。 IDが4未満の物だけ、IDを降順に並べて出力するSQL文を考えます。 貴方が考えたSQLと同様にUNIONを使って書くと SELECT * FROM TABLE WHERE ID<4 UNION SELECT * FROM TABLE ORDER BY ID DESC と言うSQL文になります。 このSQL文は、UNIONの前のSELECTの結果 ID:1 ID:2 ID:3 と、UNIONの後のSELECTの結果 ID:10 ID:9 ID:8 ID:7 ID:6 ID:5 ID:4 ID:3 ID:2 ID:1 を、繋げて並べて出力するので ID:1 ID:2 ID:3 ID:10 ID:9 ID:8 ID:7 ID:6 ID:5 ID:4 ID:3 ID:2 ID:1 と言う結果を返します。 欲しい結果は ID:3 ID:2 ID:1 なので、このSQL文は「間違っている」と言う事になります。 IDが4未満の物だけ、IDを降順に並べて出力する、正しいSQL文は SELECT * FROM TABLE WHERE ID<4 ORDER BY ID DESC となります。 従って、貴方がやりたい事は $sql = "SELECT * FROM hospytal WHERE shochi LIKE \"%$keyword%\" order by kuchikomi desc);"; // 口コミ数の降順 です。 WHERE句で絞り込むと同時に、同じSELECT文で、ORDER BY句にDESC修飾を付けて降順で並び替えします。

beterugius
質問者

お礼

詳しいご回答どうもありがとうございました。

その他の回答 (2)

  • t_ohta
  • ベストアンサー率38% (5238/13705)
回答No.2

SELECT * で抽出してますがhospytalテーブルとhospytalテーブルの構造は同じですか? 構造が異なるとエラーになります。 またORDER BYした後にUNIONしているので並べ替えは意味の無いものになってしまっています。 UNIONは前後のSELECTの結果の中から重複するものを排除するため勝手にソートします。 最終的に出てきたものがきれいに並んでいて欲しいのであればUNIONした後にORDER BYしなければいけません。

beterugius
質問者

お礼

詳しいご回答どうもありがとうございました。

  • maiko0318
  • ベストアンサー率21% (1483/6969)
回答No.1

実行直前で$sqlを表示してみればわかるのでは?

関連するQ&A