1

申し訳ありませんが、タイトルは非常にあいまいです。

基本的に、私は何かで立ち往生しています。2つのテーブルからリストする十分な作業スクリプトがあります。

イベントのリストを取得します

イベント1
イベント2
イベント3
イベント4
イベント5
イベント6

今、ユーザーは「全体的な」イベントのためにTシャツを必要としています。彼らはボランティアで、Tシャツを持っています。彼らがスチュワードを助けることができるイベントを提出するとき、彼らは私がそれらを注文できるように彼らのTシャツのサイズを選びます。

次にリストを取得します

イベント1:
小=
中カウント=
大カウント=カウント

ボランティアがTシャツのサイズを入力すると、プロフィールに保存されます。イベントは、eventsというテーブルに保存されます。

ただし、その部分は重要ではありません。私はそれを上記のように簡単にリストに載せることができ、ある程度は正しくカウントされます。問題は、ボブというボランティアがいると言うことです。ボブのTシャツのサイズは小さいです。彼はイベント1にのみボランティアをしています。他のボランティアはまだ彼らが助けることができる日に参加していません。したがって、すべてのイベントがリストされ、0以外に等しい領域は

イベント1-小=1、中= 0、大=0イベント2-小=0、中= 0、大=0など...

とにかく、ボブがイベント1、2、3、5で支援することにしたとしましょう。

次に、イベント1-小= 1、中= 0、大=0
イベント2-小=1、中= 0、大=0
イベント3-小=1、中= 0、大=0
イベント4-小= 0、中= 0、大=0
イベント5-小=1、中= 0、大=0
イベント6-小=0、中= 0、大=0

クエリは基本的に

SELECT u.id, u.userid, u.eventid, u.helping, i.userid, i.tshirt_size FROM helpers AS u LEFT JOIN profiles AS i ON u.userid=i.userid WHERE `eventid`='$eventid' AND u.helping='1' AND i.tshirt_size='$size'

次に、getTShirtCount( "eventid"、 "Small");のような関数でそれをエコーし​​ます。

イベントIDは、MySQL Fetch Arrayループによって取得され、データベースにあるイベントをループします(これは、イベントIDが取得される場所でもあります)。

イベント1=ID:1
イベント2 = ID:2
など。


支援できるイベントを送信すると、UserID = 101 EventID = 1
Helping = 1

UserID = 101
EventID = 2
Helping = 1

UserID = 101 EventID
= 3
Helping = 1

UserID = 101EventIDのような「ヘルパー」テーブルに入ります。
=4
支援=0

等...

==やりたいこと==

ユーザーのBobがイベント1-にリストされている場合、他のイベントで彼をカウントする必要はありません。カウントは、配布する各イベントに正しい量のTシャツを持参できるようにするためです。だから、私は50の小、10の大、40の中が必要だと私に言うかもしれません。

ボブがイベント1に参加している場合、彼はTシャツを受け取るので、他のイベントで別のTシャツを持ってくる必要はありません(したがって、カウントされます)。

したがって、「Bob」に以前のイベントの「Helping = '1'」がない場合は、基本的にnum_rowsカウントに1を追加するだけで済みます。

私はそれを十分に説明したと思います。

誰か助けてもらえますか?

4

5 に答える 5

0

group_byu.useridが役立つ場合があります。

于 2012-02-21T21:43:56.440 に答える
0

私は理解していると思います(しかし、あまりよくわかりません)。DISTINCTユーザーIDを選択してみてください。そうすれば、ユーザーIDは1回だけ選択されます。

于 2012-02-21T21:46:06.270 に答える
0

必要な各サイズのシャツの数を単純に把握しようとしている場合は、イベントで支援するために現在登録されているすべての人を見つけて、シャツのサイズでグループ化する必要があります。このようなもの:

SELECT size,count(*) FROM helpers,users WHERE helpers.user_id = users.user_id GROUP BY size;
于 2012-02-21T21:46:11.297 に答える
0

events私はあなたのテーブルにフィールドがあると仮定しなければなりませんでした、eventIDそしてevent_name私はあなたの質問のクエリから他のテーブルを推測することができました。

SELECT e.event_name, 
  SUM( eh.shirt_size <=> 'Small' ) as Small,
  SUM( eh.shirt_size <=> 'Medium' ) as Medium,
  SUM( eh.shirt_size <=> 'Large' ) as Large
FROM events e
LEFT JOIN
  ( SELECT h.userID, MAX(p.tshirt_size) as shirt_size, MIN(eventID) as first_event 
    FROM helpers h
    JOIN profiles p ON p.userID = h.userID
    WHERE h.helping = 1
    GROUP BY h.userID ) eh
  ON e.eventID = eh.first_event
GROUP BY e.event_name

実例:http ://sqlfiddle.com/#!2/33f9b/1

于 2012-02-21T22:35:01.797 に答える
0

私はあなたのためにテーブルをピボットしないことを選択し、クエリを(最適化のために)単純に保つことを選択しましたが、長いです。サイズごとに1つずつ、合計3つの個別のクエリとして実行し、次のように結合しましたUNION

(SELECT MAX(e.eventid) AS eventid, MAX(e.event_name) AS event_name,
   MAX(p.tshirt_size) AS size, COUNT(*) AS tshirt_count
FROM Helpers h
JOIN Events e
  ON e.eventid = h.eventid
JOIN Profile p
  ON p.user_id = h.user_id
LEFT JOIN Events e2
  ON e2.eventid < e.eventid
JOIN Helpers h2
  ON h2.eventid = e2.eventid
  AND h2.user_id = h.user_id
WHERE p.tshirt_size = 'small'
  AND e2.eventid IS NULL
GROUP BY e.eventid)
UNION ALL
(SELECT MAX(e.eventid) AS eventid, MAX(e.event_name) AS event_name,
   MAX(p.tshirt_size) AS size, COUNT(*) AS tshirt_count
FROM Helpers h
JOIN Events e
  ON e.eventid = h.eventid
JOIN Profile p
  ON p.user_id = h.user_id
LEFT JOIN Events e2
  ON e2.eventid < e.eventid
JOIN Helpers h2
  ON h2.eventid = e2.eventid
  AND h2.user_id = h.user_id
WHERE p.tshirt_size = 'medium'
  AND e2.eventid IS NULL
GROUP BY e.eventid)
UNION ALL
(SELECT MAX(e.eventid) AS eventid, MAX(e.event_name) AS event_name,
   MAX(p.tshirt_size) AS size, COUNT(*) AS tshirt_count
FROM Helpers h
JOIN Events e
  ON e.eventid = h.eventid
JOIN Profile p
  ON p.user_id = h.user_id
LEFT JOIN Events e2
  ON e2.eventid < e.eventid
JOIN Helpers h2
  ON h2.eventid = e2.eventid
  AND h2.user_id = h.user_id
WHERE p.tshirt_size = 'large'
  AND e2.eventid IS NULL
GROUP BY e.eventid)
ORDER BY eventid, size = 'large', size = 'medium', size = 'small'

これにより、次のような結果が返されます。

Event1       Small       1
Event1       Medium      0
Event1       Large       0
Event2       Small       0
Event2       Medium      0
Event2       Large       0
...

このクエリは、イベントが時系列で。によって順序付けられていることを前提としていますeventid

于 2012-02-21T23:01:35.700 に答える