web-dev-qa-db-ja.com

SQLクエリでLEFT JOINの順序を並べ替える方法は?

クレイジーな答えを求めてグーグルで試しましたが、これを解決できなかったので、誰かが助けてくれることを願っています。

ユーザーのテーブル、非常に単純なテーブルがあるとします。

id | userName
3    Michael
4    Mike
5    George

そして私は彼らの車と価格の別の表を持っています。

id | belongsToUser | carPrice
1    4               5000
2    4               6000
3    4               8000

今、私がする必要があるのは、このようなものです(自由に書き換えてください):

   SELECT
      `userName`,
      `carPrice`
   FROM `users`
   LEFT JOIN `cars`
   ON cars.belongsToUser=users.id
   WHERE `id`='4'

返されるもの:

Mike | 5000

しかし、最初のエントリではなく、特定のユーザーの最も高価な車が必要です。

そこで質問:carPrice、DESCが注文するLEFT JOINテーブルを設定するにはどうすればよいですか?

40

GROUP BYMAXを使用してみてください。

SELECT u.userName, MAX(c.carPrice)
FROM users u
    LEFT JOIN cars c ON u.id = c.belongsToUser
WHERE u.id = 4;
GROUP BY u.userName;

GROUP BYに関する詳細情報

Group by句は、group by列の一意の組み合わせに基づいて、選択したレコードをグループに分割するために使用されます。これにより、レコードの各グループに順番に適用される集計関数(MAX、MIN、SUM、AVGなど)を使用できます。データベースは、グループごとに1つの結果レコードを返します。

たとえば、次のような表に時間と場所の温度を表すレコードのセットがある場合:

Location   Time    Temperature
--------   ----    -----------
London     12:00          10.0
Bristol    12:00          12.0
Glasgow    12:00           5.0
London     13:00          14.0
Bristol    13:00          13.0
Glasgow    13:00           7.0
...

次に、場所ごとに最高温度を検索する場合は、温度レコードをグループ分けして、特定のグループの各レコードが同じ場所にあるようにする必要があります。次に、各グループの最高温度を求めます。これを行うためのクエリは次のようになります。

SELECT Location, MAX(Temperature)
FROM Temperatures
GROUP BY Location;
47
a'r
   SELECT
      `userName`,
      `carPrice`
   FROM `users`
   LEFT JOIN (SELECT * FROM `cars` ORDER BY `carPrice`) as `cars`
   ON cars.belongsToUser=users.id
   WHERE `id`='4'
16
vencedor

他のいくつかの答えは、MAXを使用したソリューションを提供します。いくつかのシナリオでは、集計関数を使用することは可能ではないか、パフォーマンスがありません。

私がよく使う代替策は、結合で相関サブクエリを使用することです...

SELECT
   `userName`,
   `carPrice`
FROM `users`
LEFT JOIN `cars`
ON cars.id = (
  SELECT id FROM `cars` WHERE BelongsToUser = users.id ORDER BY carPrice DESC LIMIT 1
)
WHERE `id`='4'
12
MatBailie

これにより、ユーザーにとって最も高価な車が得られ​​ます。

SELECT users.userName, MAX(cars.carPrice)
FROM users
LEFT JOIN cars ON cars.belongsToUser=users.id
WHERE users.id=4
GROUP BY users.userName

ただし、このステートメントにより、すべての車の価格を降順で並べ替えたいと思うようになります。

そこで質問:carPrice、DESCが注文するLEFT JOINテーブルを設定するにはどうすればよいですか?

だからあなたはこれを試すことができます:

SELECT users.userName, cars.carPrice
FROM users
LEFT JOIN cars ON cars.belongsToUser=users.id
WHERE users.id=4
GROUP BY users.userName
ORDER BY users.userName ASC, cars.carPrice DESC
7

これを試してください:

   SELECT
      `userName`,
      `carPrice`
   FROM `users`
   LEFT JOIN `cars`
   ON cars.belongsToUser=users.id
   WHERE `id`='4'
   ORDER BY `carPrice` DESC
   LIMIT 1

フェリックス

2
Felix Geenen