1

次のクエリは、私が望むことを行います。users テーブルのすべての結果を返し、詳細テーブルに一致する場合は、関連するデータを返します。

ユーザー

id|username

詳細

id|userid|firstname|lastname


$sql = "SELECT u.*, d.*
FROM `users` u
LEFT JOIN `details` d on
u.id = d.userid
ORDER BY $strorder";

ただし、同じことをしたい追加のテーブルに参加しようとすると、users テーブルのすべての結果が返され、3 番目のテーブルに一致する場合は、関連データ (このユーザーのフォロワーの合計) が返されます。 -- 1 つのレコードのみを返します。

3番目のテーブル

従う

id|followerid|followedid

$sql = "SELECT u.*, d.*, COUNT(f.id)
FROM `users` u
LEFT JOIN `details` d on
u.id = d.userid
LEFT JOIN `follow` f on
u.id = f.followedid
ORDER BY $strorder";

誰かが私が間違っていることを見ることができますか? ご提案いただきありがとうございます。

どうもありがとう。

4

2 に答える 2

2

フィールドを選択するために * を避けるようにしてください。データをグループ化する方が明確になります (mysql がグループ化を非常に許容している場合でも)。

集計関数 (COUNT、SUM など) がある場合、その他の「集計されていない」要求フィールドは GROUP BY 句に含める必要があります。

Mysql では、すべてのフィールドを GROUP BY する必要はありませんが、「可能な限り ANSI に」することは非常に良い習慣だと思います (別の DBMS を使用する場合に便利です)。

SELECT u.id, u.username, d.firstname, d.lastname, count(*) as numberfollowers
FROM user u
LEFT JOIN details d on u.id = d.userid
LEFT JOIN follow f on u.id = f.followedid
GROUP BY u.id, u.username, d.firstname, d.lastname --or just GROUP BY u.id with Mysql
ORDER BY count(*) desc
于 2012-09-05T14:50:01.690 に答える
0

集計関数であるCOUNTは、他の列で選択された場合、選択リスト内の他の列で結果をグループ化する必要があります。

ユーザーと詳細から選択する列を使用してクエリを書き直し、それらの列でグループ化する必要があります。

于 2012-09-05T14:50:12.603 に答える