对不起,标题很模糊。
基本上,我遇到了困难。我有一个充足的工作脚本,从两个表中列出。
它提取了一系列事件
事件1
事件2
活动3
活动4
活动5
活动6
现在,用户需要T恤来进行“整体”活动。他们是志愿者,他们有T恤。当他们提交哪些可以帮助管家的活动时,他们会选择他们的T恤尺码,以便我可以订购。
然后我得到一个清单
活动1:
小=计数
中=计数
大=计数
当志愿者输入他们的T恤尺码时,它会保存在他们的个人资料中。事件存储在名为events的表中。
然而,这部分并不重要。我可以很容易地将它列出如上所列,并且它在一定程度上确实是正确的。问题是,我有一个名叫鲍勃的志愿者。 Bob的T恤尺码很小。他只是参加第一项赛事的志愿者。没有其他志愿者进入他们可以帮助的日子。所以我会列出所有事件,唯一等于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( “事件ID”, “小”);
事件ID由MySQL Fetch Array循环拾取,循环我在我的数据库中的事件(这也是从中获取事件ID的地方)。
事件1 = ID:1
事件2 = ID:2
等。
当他们提交他们可以提供帮助的事件时,它会进入“助手”表,例如
UserID = 101
EventID = 1
帮助= 1
UserID = 101
EventID = 2
帮助= 1
UserID = 101
EventID = 3
帮助= 1
UserID = 101
EventID = 4
帮助= 0
等...
==我想做什么==
如果用户Bob已被列入事件1 - 我不需要在任何其他事件中计算他。计数是这样我可以为每个活动带来正确数量的T恤来分发。所以它可能告诉我需要50个小型,10个大型,40个中型。
如果Bob正在参加第一场比赛,那么他将获得他的T恤,所以他不需要我带来另一件(因此被计算在内)。
所以,我基本上只需要将它添加到num_rows计数1,如果“Bob”没有为任何先前的事件添加“Helping ='1'”。
我希望我已经解释得那么好。
有人可以帮忙吗?
答案 0 :(得分:0)
你可以通过u_userid分组,这可能有帮助。
答案 1 :(得分:0)
我想我明白了(虽然不太确定)。尝试选择DISTINCT用户ID。这样,用户ID只会被选中一次。
答案 2 :(得分:0)
如果您只是想弄清楚您需要的每件衬衫的数量,那么您应该找到所有当前注册的人在任何情况下帮助,然后按衬衫尺寸分组。像这样:
SELECT size,count(*) FROM helpers,users WHERE helpers.user_id = users.user_id GROUP BY size;
答案 3 :(得分: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
答案 4 :(得分: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
按时间顺序排序。