1

对不起,标题很模糊。

基本上,我被一些东西困住了。我有一个充足的工作脚本,其中列出了两个表。

它提取事件列表

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

现在,用户需要“整体”活动的 T 恤。他们是志愿者,他们有 T 恤。当他们提交可以帮助管家的活动时,他们会选择他们的 T 恤尺码,以便我订购。

然后我得到一个清单

事件 1:
小 = 计数
中 = 计数
大 = 计数

当志愿者输入他们的 T 恤尺寸时,它会保存在他们的个人资料中。这些事件存储在一个称为事件的表中。

但是,那部分并不重要。我可以很容易地把它列在上面,并且在一定程度上它确实是正确的。问题是,假设我有一个叫 Bob 的志愿者。Bob 的 T 恤尺码偏小。他只是为活动 1 做志愿者。没有其他志愿者进入他们可以提供帮助的日子。所以我会列出所有事件,唯一等于 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
等等。

当他们提交他们可以帮助的事件时,它会进入“帮助者”表,例如 UserID = 101
EventID = 1
Helping = 1

UserID = 101
EventID = 2
Helping = 1

UserID = 101
EventID = 3
Helping = 1

UserID = 101
EventID = 4
帮助 = 0

ETC...

== 我想做什么 ==

如果用户 Bob 已在事件 1 中列出 - 我不需要将他计入任何其他事件。计数是为了让我可以在每个活动中分发正确数量的 T 恤。所以它可能会告诉我我需要 50 个小号、10 个大号、40 个中号。

如果 Bob 参加活动 1,那么他会得到他的 T 恤,所以他不需要我在任何其他活动中带另一件(因此被计算在内)。

所以,我基本上需要它只在 num_rows 计数中加 1,如果“Bob”对于任何以前的事件都没有“Helping='1'”。

我希望我已经解释得足够好。

任何人都可以帮忙吗?

4

5 回答 5

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

我选择不为您旋转表格,并保持查询简单(用于优化),尽管很长。我将其作为三个单独的查询进行,每个大小一个,然后将它们加入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 回答
0

您可以 group_by u.userid 这可能会有所帮助。

于 2012-02-21T21:43:56.440 回答
0

我想我明白(虽然不太确定)。尝试选择一个 DISTINCT 用户 ID。这样一个用户标识只会被选中一次。

于 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 回答