-1

これは mybb_reputation テーブルです

mybb_reputation テーブル

ridこれらすべての行の合計が 3 に達した場合、行数を取得したいと考えてreputationいます。たとえば、この場合 (上の画像を参照してください)、クエリを実行すると、rid 1、2、および 3 のいずれかが返されます (したがって、合計の評判は 3 になります) または、その評判がちょうど 3 に等しいため、rid 5 のみを返します。

このクエリを実行してみました。

SELECT * FROM mybb_reputation WHERE SUM(reputation) = 3;

ただし、MySQL の知識が限られているため、エラーが表示されます。例: #1111 - グループ関数の無効な使用

助けてください!

4

4 に答える 4

1

この答えは私のコメントと一致します-

1 レコードを検索 (簡単)

SELECT tmp1.rid AS rid
FROM mybb_reputation AS tmp1
WHERE tmp1.reputation = 3;

任意の 2 つのレコードを検索します (関係の順序は回答に関係しないため、< を使用します)

SELECT CONCAT_WS(',',tmp1.rid, tmp2.rid) AS rid
FROM mybb_reputation AS tmp1
JOIN mybb_reputation AS tmp2
  ON tmp1.rid < tmp2.rid
WHERE tmp1.reputation + tmp2.reputation = 3

任意の 3 つのレコードを検索します (< に関しては前と同じ考え方)

SELECT CONCAT_WS(',',tmp1.rid, tmp2.rid, tmp3.rid) AS rid
FROM mybb_reputation AS tmp1
JOIN mybb_reputation AS tmp2
  ON tmp1.rid < tmp2.rid
JOIN mybb_reputation AS tmp3
  ON tmp2.rid < tmp3.rid
WHERE tmp1.reputation + tmp2.reputation + tmp3.reputation = 3

4 を見つけます (アルゴリズムはただ繰り返されます)

SELECT CONCAT_WS(',',tmp1.rid, tmp2.rid, tmp3.rid, tmp4.rid) AS rid
FROM mybb_reputation AS tmp1
JOIN mybb_reputation AS tmp2
  ON tmp1.rid < tmp2.rid
JOIN mybb_reputation AS tmp3
  ON tmp2.rid < tmp3.rid
JOIN mybb_reputation AS tmp4
  ON tmp3.rid < tmp4.rid
WHERE tmp1.reputation + tmp2.reputation + tmp3.reputation + tmp4.reputation = 3

必要な組み合わせの数だけ、これを続ける必要があります。

于 2013-10-12T17:04:19.577 に答える
0
SELECT *
FROM mybb_reputation
GROUP BY uid
HAVING SUM(reputation) >= 3
ORDER BY RAND()
LIMIT 1

これの正確な順序についてはわかりませんが、必要なすべての条件が含まれている必要があります。

そして正直なところ、あなたのデータ構造はそのようなクエリに答えるには非常に奇妙に思えます。

于 2013-10-12T15:55:11.043 に答える
0

おそらく、グループの合計を取得する必要があります。uid でグループ化すると仮定します。

SELECT * FROM mybb_reputation 
WHERE uid in 
  (Select uid FROM mybb_reputation
   GROUP BY uid
   HAVING SUM(reputation) = 3);

集計条件に一致する個々の行を選択する場合は、サブクエリが必要になります。ネストされたサブクエリは、目的の条件を持つグループを見つけます。次に、外側のクエリは、そのグループにある各行を返すように指示します。グループは何らかの方法で識別される必要があり、この場合は uid を使用しています。

MySQL の一部の実装では、これを相関サブクエリとして扱います。これは、テーブルが大きい場合に問題になる可能性があります。その問題がある場合は、サブセレクトのレイヤーをもう 1 つ追加して修正できます。

SELECT * FROM mybb_reputation 
WHERE uid in 
  (SELECT * FROM
     (Select uid FROM mybb_reputation
      GROUP BY uid
      HAVING SUM(reputation) = 3));

または、サブクエリの代わりに結合を使用します。

SELECT r1.* FROM mybb_reputation r1,
     (Select uid FROM mybb_reputation
      GROUP BY uid
      HAVING SUM(reputation) = 3) r2
WHERE r1.uid = r2.uid;
于 2013-10-12T15:59:41.527 に答える
0

これを試して

SELECT * FROM mybb_reputation GROUP BY rid HAVING SUM(reputation) = 3 ORDER BY RAND() LIMIT 1;
于 2013-10-12T16:00:38.927 に答える