2012-02-21 61 views
1

對不起,標題非常含糊。MySQL和PHP - 僅列出以前未列出的項目

基本上,我被一些東西卡住了。我有一個充足的工作腳本,從兩個表中列出。

它拉事件

事件1
事件2
事件3
事件4
事件5
事件6

現在,用戶需要的T恤衫的列表「整體」事件。他們是志願者,他們有T恤。當他們提交可以幫助管家的事件時,他們選擇他們的T恤尺寸,以便我可以訂購。

然後我得到一個列表

事件1:
小=計數
中等=計數
大=計數

當志願者進入他們的T恤尺寸,它被保存在他們的簡介。這些事件存儲在一個名爲events的表中。

但是,該部分並不重要。我可以很容易地將它列入上面,並在一定程度上確實計算正確。問題是,比如說我有一個叫Bob的志願者。 Bob的T恤大小很小。他只是爲第一場活動提供志願服務。沒有其他志願者參加了這個日子,他們可以幫助他們。所以我會列出的所有事件,唯一的面積將等於0以外的任何事情都是

事件1 - 小= 1,中等= 0,大= 0 事件2 - 小= 0,中等= 0,大= 0 等等等等....

反正說Bob決定,以幫助在事件1,2,3和5

它然後顯示 事件1 - 小= 1,中等= 0,Large = 0
Event 2 - Small = 1,Medium = 0,Large = 0
Event 3 - Small = 1,Medium = 0,Large = 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(「事件ID」,「小」);

事件ID是由MySQL Fetch Array循環拾取的,循環了我在數據庫中的事件(這也是事件ID從中拾取的事件)。

事件1 = ID:1
事件2 = ID:2
等等。

當他們提交他們可以幫助的事件,它進入一個 「幫手」 表,像 用戶ID = 101
事件ID = 1
幫助= 1

用戶ID = 101
事件ID = 2
幫助= 1

用戶ID = 101
的EventID = 3
幫助= 1

用戶ID = 101
事件ID = 4
幫助= 0

等...

==我想DO ==

IF的用戶Bob,一直在事件1中列出 - 我不需要將他計入任何其他事件。伯爵是這樣的,我可以把正確數量的T恤衫分發給每個活動。所以它可能會告訴我我需要50個小,10個大,40箇中等。

如果鮑勃參加第一項活動,那麼他將會拿到他的T恤,所以他不需要我在其他任何事件中帶上另一個(因此被計數)。

所以,我基本上只需要將它添加到num_rows計數,如果以前的任何事件,「Bob」沒有「Helping ='1'」。

我希望我解釋得很好。

任何人都可以幫忙嗎?

+0

不同事件的襯衫是一樣的嗎?你之前的活動是什麼意思?早些時候?或者不管他選擇了多少事件,你只想爲一個用戶計算一件襯衫? – piotrm 2012-02-21 21:49:23

+0

這些襯衫都是一樣的每個事件。以前的事件,我的意思是事件2是在事件3等之後......並且是的,如果他們根據上面的查詢參加每個事件 - 它將對每個事件的「小」計數1。如果他們在事件1,我不希望它被計入任何其他事件中,因爲我已經爲他們爲事件1帶了一件T恤。 – TheMonk 2012-02-21 21:57:25

+1

事件2在事件3之後基於什麼? – piotrm 2012-02-21 22:13:24

回答

0

我必須假設你events表有場eventIDevent_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

+0

您好,感謝您的幫助。這對我來說很有用,但我現在已經適應了整個系統,而不是我給出的例子,它不像預期的那樣工作。我會繼續努力......當我能夠按照希望工作時打勾。非常感謝您的幫助。 – TheMonk 2012-02-22 10:58:52

+0

事件表,我有多年......如2009年,2010年,2011年和2012現在這幾年的事件....我可以過濾視圖,只算在今年「2012」的事件。例如...? – TheMonk 2012-02-22 13:55:52

+0

更改'WHERE h.helping = 1'爲'WHERE h.helping = 1 AND h.eventID> $ countfromthisID'和最後一組前添加相同的條件下爲'WHERE e.eventID> ...'BY – piotrm 2012-02-22 17:25:38

0

你可以group_by u.userid這可能有所幫助。

0

我想我明白了(雖然不太確定)。嘗試選擇一個DISTINCT用戶標識。這樣一個用戶名只被選中一次。

0

如果你只是想弄清楚你需要的每件大小襯衫的數量,那麼你應該找到所有當前註冊的人在任何情況下幫助,然後按襯衫大小進行分組。事情是這樣的:

SELECT size,count(*) FROM helpers,users WHERE helpers.user_id = users.user_id GROUP BY size; 
+0

問題是我想列出每個事件的計數,所以我可以看到有多少事件1需要小....會這樣嗎? – TheMonk 2012-02-21 22:05:11

+0

當被添加到助手數據庫時,他們得到每個用戶6個條目,因爲有六個事件。 1 =參加,0 =不參加...它通過user_id加入配置文件「tshirt_size」。 後來我去找事件ID = 1和tshirt_size =小,並要求數.... 如果他們也要去事件2,它計算他們在這過,但我不希望它太 - 只是事件1 .... – TheMonk 2012-02-21 22:10:36

+0

我不明白你爲什麼要計數每個事件。伯爵實際上代表什麼?有沒有真正的世界問題,你正在努力解決,即。你需要知道每場比賽有多少球衣? – jasonlfunk 2012-02-22 12:49:59

0

我選擇不轉動表給你,並隨時查詢簡單(優化),雖然長。我做到了三個單獨的查詢,每一個的大小,然後用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