MySQL& PHP - 仅列出之前未列出的项目

时间:2012-02-21 21:37:33

标签: php mysql select mysql-num-rows

对不起,标题很模糊。

基本上,我遇到了困难。我有一个充足的工作脚本,从两个表中列出。

它提取了一系列事件

事件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'”。

我希望我已经解释得那么好。

有人可以帮忙吗?

5 个答案:

答案 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表格包含字段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

答案 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按时间顺序排序。