- ベストアンサー
複数のSELECT文の結合について
$sql = "(SELECT * FROM hospytal WHERE shochi LIKE \"%$keyword%\") UNION (SELECT * FROM hospytal order by kuchikomi desc);"; // 口コミ数の降順 このSQL文は間違っているでしょうか。 やりたいことは、hospytalテーブルのshochiカラムでキーワードを含むものを、 降順にソートしたいのですが。 どうすればちゃんと動作するのか、ご教授お願い致します。
- みんなの回答 (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修飾を付けて降順で並び替えします。
その他の回答 (2)
- t_ohta
- ベストアンサー率38% (5238/13705)
SELECT * で抽出してますがhospytalテーブルとhospytalテーブルの構造は同じですか? 構造が異なるとエラーになります。 またORDER BYした後にUNIONしているので並べ替えは意味の無いものになってしまっています。 UNIONは前後のSELECTの結果の中から重複するものを排除するため勝手にソートします。 最終的に出てきたものがきれいに並んでいて欲しいのであればUNIONした後にORDER BYしなければいけません。
お礼
詳しいご回答どうもありがとうございました。
- maiko0318
- ベストアンサー率21% (1483/6969)
実行直前で$sqlを表示してみればわかるのでは?
お礼
詳しいご回答どうもありがとうございました。