0

次のクエリのカウントを組み合わせようとしています。

  SELECT recipient AS otheruser, COUNT(*) 
    FROM privatemessages 
   WHERE sender = '$userid' 
GROUP BY recipient

  SELECT sender AS otheruser, COUNT(*) 
    FROM privatemessages 
   WHERE recipient = '$userid' 
GROUP BY sender

とにかくこれらの2つのクエリを組み合わせて、「otheruser」ごとにcount(*)を追加する場合

4

4 に答える 4

2

最も簡単な方法は、SUM/Conditionを使用することです

SELECT
     CASE WHEN sender = '$userid' THEN recipient else sender END AS OtherUser,
     SUM(sender = '$userid') AS RCount,
     SUM(recipient = '$userid') AS SCount,
     COUNT(*) total
FROM
     privatemessages 
WHERE
     '$userid' IN (sender , recipient )
GROUP BY
     OtherUser

デモ

アップデート

deltabとMichaelBuenのおかげで、SUMとGROUPBYのステートメントをクリーンアップしました。

于 2012-05-05T04:19:48.400 に答える
0

最も簡単な方法は、2つのクエリを使用することです。
2つのクエリを使用して2つの異なるデータセットを要求しても害はありませんが、1つでそれを行う理由は1つではありません。

于 2012-05-05T04:28:06.017 に答える
0

次のように、それらをUNIONと組み合わせることができます。

SELECT otheruser, COUNT(*) FROM
(SELECT recipient AS otheruser
FROM privatemessages 
WHERE sender = '$userid' 
GROUP BY recipient
UNION
SELECT sender AS otheruser
FROM privatemessages 
WHERE recipient = '$userid' 
GROUP BY sender)
于 2012-05-05T04:29:09.200 に答える
-1
SELECT recipient AS r, sender AS s, COUNT(total) // can't use same alias
FROM privatemessages
WHERE sender = '$userid' AND recipient = '$userid'
GROUP BY s;

次に、結果関数で、カウントを呼び出します

while ($row = $result) {
  echo $row['COUNT(total)'];
}

このクエリは期待どおりに機能するはずです。オリジナルの唯一の問題は、デュアルエイリアスと2つの異なるフィールドのグループ化でした。これは2つの別々のクエリで可能ですが、組み合わせると実行できません(少なくともエイリアス、GROUP BYではそうは思わないでください)。

これがあなたのために働くことを願っています。

アップデート

優れた代替手段COUNTは、単にnum_rows...を使用することです。したがって、上記のクエリは次のようになります。

SELECT recipient AS r, sender AS s // can't use same alias
FROM privatemessages
WHERE s = '$userid' AND r = '$userid'
GROUP BY s;

次に、結果関数で、関数を呼び出しnum_rowsます。

mysql_num_rows($result);
于 2012-05-05T04:29:21.270 に答える