MySQL 和 PHP - 仅列出以前未列出的项



对不起,标题很模糊。

基本上,我陷入了困境。我有一个从两张表中列出的充足的工作脚本。

它提取事件列表

事件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表有字段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

您可以通过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按时间顺序排列。

相关内容

  • 没有找到相关文章

最新更新