2012-01-27 8 views
0

を返ささえせずに()COUNTを取得: - 友人の数が を要求 - 新しいプライベートメッセージの数 - 通知の数を - ユーザーのユーザー名など。 PMをあなたに送ったり、友人にあなたを招待したりしました。は、データが、私はちょうど1つのクエリでデータベースからいくつかの事取得しようとしています

以下のクエリで指定されたユーザーIDは、このユーザーに対して通知があるかどうかを確認するユーザーです。

通知がない場合、フレンドリクエストまたはプライベートメッセージの数も返されません。

これは私が構築しているクエリであり、それは上記の問題とは別に動作します。誰もが自分のSQLの知識を共有し、私を私を助けることができますので、もし私が、私が行方不明です何かわからない

SELECT 
    n.id, 
    n.type, 
    u.username, 
    COUNT(fr.friend_id) as frc, 
    COUNT(pm.pm_id) as pmc 
FROM 
    notifications as n, 
    users as u 
LEFT JOIN 
    private_messages as pm 
ON 
    pm.to_user = '1' 
AND 
    pm.status = 'unread' 
LEFT JOIN 
    friends as fr 
ON 
    fr.friend_id = '1' 
AND 
    fr.status = 'pending' 
WHERE 
    n.user_id='1' 
AND 
    u.id = n.from_id 
ORDER BY 
    n.id ASC 

それを深く感謝するでしょう。

ありがとうございます!

ps。私はまだ非常に複雑なクエリには新しくなっていますので、上記のクエリで完全にオフになっている場合はお知らせください:)。

表構造:おそらくによって

Sample friends table structure 
+--------------------------+-----------------------------+ 
| Field     | Type      | 
+--------------------------+-----------------------------+ 
| user_id     | int(10)      | 
| friend_id    | int(10)      | 
| status     | ENUM('pending','accepted') | 
| user_id     | int(10)      | 
+--------------------------+-----------------------------+ 

Sample notifications table structure 
+--------------------------+---------------------+ 
| Field     | Type    | 
+--------------------------+---------------------+ 
| id      | int(10)    | 
| type      | ENUM('pm','friend') | 
| user_id     | int(10)    | 
| from_id     | int(10)    | 
+--------------------------+---------------------+ 

Sample private message table structure 
+--------------------------+-----------------------+ 
| Field     | Type     | 
+--------------------------+-----------------------+ 
| pm_id     | int(12)    | 
| to_user     | int(10)    | 
| from_user    | int(10)    | 
| status     | ENUM('read','unread') | 
+--------------------------+-----------------------+ 

Sample users table structure 
+--------------------------+---------------+ 
| Field     | Type   | 
+--------------------------+---------------+ 
| id      | int(10)  | 
| username     | varchar(50) | 
+--------------------------+---------------+ 
+0

は、あなたが "UNION SELECT" を試したことがありますか? –

+0

私はそれが何であるかわからないので、私はないと言うことはできません。 :( – MrE

+0

テーブル構造を投稿すると、クエリに使用しているものすべてが必ずしもすべての列である必要はありません。 –

答えて

0

あなたのクエリでは、関係のない物事をミックス。また、少なくとも1つの通知を受けるという要件に結果が得られるかどうかは関係ありません。デザインの観点からは、これら2つを混在させるべきではないので、2つのクエリとして書き直しています。

あなたのカウントのためcorrelated subqueryを使用する必要があります。

select 
    u.username, 
    (select COUNT(fr.friend_id) from friends as fr where fr.friend_id = u.id AND fr.status = 'pending') as frc, 
    (select COUNT(pm.pm_id) from private_messages as pm where pm.to_user = u.id AND pm.status = 'unread') as pmc 
from users u 
where u.id='1' 

通知のクエリが元のクエリの簡易版である:

SELECT 
    n.id, 
    n.type, 
    u.username 
FROM 
    users as u 
LEFT JOIN 
    notifications as n ON n.from_id=u.id 
WHERE 
    u.id = '1' 
ORDER BY 
    n.id ASC 
+0

私はちょうど最小限にクエリの数を維持しようとしています(ただし、2つのクエリは時々パフォーマンスが改善されます)。しかし、これが1つのクエリでは実際には不可能な場合は、2と一緒に行かなければならないと思います。 – MrE

+0

@MrE問題は、2つのクエリが基本的に無関係の結果を返すことです。私のコードの理解可能性は、保存できる数ミリ秒より重要なので、私はいつもパフォーマンスの考慮事項を無視しています。 – dasblinkenlight

+0

あなたが正しいと思って、これを答えにします。 ご協力いただきありがとうございます。 – MrE

0

忘れましグループ:

WHERE 
     n.user_id='1' 
    AND 
     u.id = n.from_id 
    GROUP BY n.id, 
    n.type, 
    u.username 
    ORDER BY 
     n.id ASC 

乾杯

+0

試してみましょう:)。 更新:私はいくつかの組み合わせを試しましたが、運がありません:/。 – MrE

1

申し訳ありませんが、私はMySQLの構文を知らない、しかし、あなたが

... 
From 
    users as u 
LEFT JOIN 
    notifications as n ON <whatever> 
... 
を試すことができます

あなたは何を持っていますか? yは私が知っているすべてのものと同等です。しかし、あなたのUserテーブルが常にデータを持っているとすれば、これはうまくいくかもしれません。 リスト通知の、およびカウントのスカラーセット -

+0

良い考えですが、私はこのクエリで私を助けてくれるとは思っていません(私は非常に間違っているかもしれませんが、私はSQLクエリに熟練していません)。 助けてくれてありがとう、ありがとう! – MrE

関連する問題