0

初めまして、タイトルで大変失礼いたしました。この質問を適切に表現する方法が本当にわかりませんでした。誰かがより良い言葉遣いを考えられる場合は、それを編集するか、私に教えてください.

質問に:

私は2つのテーブルを持っています。usage_logsserversserversクライアントが特定のサーバーと通信するために必要なすべてのサーバー情報を保存します。usage_logsもちろん、どのユーザーが特定のサーバーをどのサーバーをどのくらいの期間使用したかを保存します。

現在使用されているユーザー数が最も少ないサーバーのサーバー情報を選択するクエリが必要です。

これが私の現在のクエリです:

SELECT servers.ip, servers.serverkey, servers.port, servers.id, COUNT(usage_logs.sid) nbr 
FROM servers 
LEFT JOIN usage_logs ON servers.id = boot_logs.sid 
WHERE usage_logs.time+usage_logs.date > 1344076143 
      AND usage_logs.sid IS NOT NULL 
      AND servers.status='ONLINE' 
GROUP BY sid 
ORDER BY nbr DESC;

は現在の1344076143時刻に置き換えることができます (実際のスクリプトではそうです)。このクエリはほとんど機能します。サーバーを選択しています、他のサーバーは実際には使用されていないため、WHERE usage_logs.time+usage_logs.date > 1344076143基準を満たしていないため、出力にリストされていません。

そのサーバーをまだリストする方法が必要ですが、方法がわかりません。

また、usage_logs.sid IS NOT NULL最近使用状況の追跡を改善しようと試み始めたばかりなので、今日までsidは存在しませんでした。

usage_logs.sidはサーバー ID で、 まで一致しservers.idます。

私はこれについて徹底的にグーグルで調べてきましたが、実際にはJOINステートメントを使用したことさえありません。MySQL のスキルを向上させたいと切望しています。

4

1 に答える 1

0

WHERE句の条件が、外部結合NULLによって生成された値を持つ行を効果的に除外しているため、行が除外されています (は の後に評価されるため)。LEFTWHEREFROM / JOIN

あなたがしなければならないことは、特定の日付以降に使用されているサーバーまたはまったく使用されていないサーバーのいずれかを取得するための ed テーブルORの条件です。LEFT JOIN

試す:

SELECT    a.ip, 
          a.serverkey, 
          a.port, 
          a.id, 
          COUNT(b.sid) nbr 
FROM      servers a
LEFT JOIN usage_logs b ON a.id = b.sid 
WHERE     a.status='ONLINE' AND 
          (b.time + b.date > 1344076143 OR b.sid IS NULL)
GROUP BY  a.id 
ORDER BY  nbr
于 2012-08-04T11:03:24.443 に答える