对不起,标题很模糊。
基本上,我陷入了困境。我有一个从两张表中列出的充足的工作脚本。
它提取事件列表
事件1
事件2
事件3
事件4
事件5
事件6
现在,用户需要t恤衫参加"整体"活动。他们是志愿者,他们有t恤衫。当他们提交哪些活动可以帮助管理时,他们会选择自己的t恤尺寸,这样我就可以订购了。
然后我得到一个列表
事件1:
Small=计数
Medium=计数
大型=计数
当志愿者输入他们的t恤尺寸时,它会保存在他们的个人资料中。这些事件存储在一个名为events的表中。
然而,这部分并不重要。我可以很容易地把它列在上面,在一定程度上,它确实是正确的。问题是,比方说我有一个叫鲍勃的志愿者。鲍勃的t恤是小码的。他只是第一次活动的志愿者。目前还没有其他志愿者进入他们可以帮助的日子。所以我会列出所有事件,唯一等于0以外的区域是
事件1-小=1,中=0,大=0事件2-小=0,中=0,大=0等等…
无论如何,假设Bob决定在活动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
等等。
当他们提交他们可以帮助的事件时,它会进入一个"助手"表,比如用户ID=101
事件ID=1
帮助=1
用户ID=101
事件ID=2
帮助=1
用户ID=101
事件ID=3
帮助=1
用户ID=101
事件ID=4
帮助=0
等等。。。
===我想做什么===
如果用户Bob已在事件1中列出,则我不需要将他计入任何其他事件。计数是为了让我能把正确数量的t恤带到每个活动中分发。所以它可能会告诉我我需要50个小的,10个大的,40个中等的。
如果Bob参加活动1,他会得到他的t恤,所以他不需要我在任何其他活动中带另一件(因此也算在内)。
因此,如果"Bob"对以前的任何事件都没有"Helping='1'",那么我基本上只需要在num_rows计数中加1。
我希望我已经解释得足够好了。
有人能帮忙吗?
我不得不假设您的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
您可以通过u.userid进行分组,这可能会有所帮助。
我想我能理解(但不太确定)。尝试选择DISTINCT用户ID。这样一来,用户ID只能被选择一次。
如果你只是想弄清楚每种尺码的衬衫需要多少件,那么你应该找到目前注册的所有人,在任何活动中提供帮助,然后按衬衫尺码分组。类似这样的东西:
SELECT size,count(*) FROM helpers,users WHERE helpers.user_id = users.user_id GROUP BY size;
我选择不为您透视表,并保持查询简单(用于优化),尽管时间很长。我把它作为三个单独的查询来完成,每个大小一个,然后用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
按时间顺序排列。