MySQL & PHP - только элементы списка, не перечисленные ранее - PullRequest
1 голос
/ 22 февраля 2012

Извините, название очень расплывчатое.

По сути, я застрял с чем-то.У меня есть достаточно рабочий скрипт, который перечисляет из двух таблиц.

Он извлекает список событий

Событие 1
Событие 2
Событие 3
Событие 4
Событие 5
Событие 6

Теперь пользователям нужны футболки для «общего» события.Они добровольцы, и у них есть футболки.Когда они отправляют события, которые могут помочь управляющему, они выбирают размер их футболки, чтобы я мог их заказать.

Затем я получаю список

Событие 1:
Small = Count
Средний = Количество
Большой = Количество

Когда волонтер вводит размер своей футболки, он сохраняется в ПРОФИЛЕ.События хранятся в таблице, называемой событиями.

Однако эта часть не важна.Я могу легко внести его в список, как указано выше, и он в определенной степени считается правильным.Проблема в том, скажем, у меня есть волонтер по имени Боб.Размер футболки Боба - Маленький.Он только добровольно участвует в Событии 1. Никакие ДРУГИЕ ВОЛОНТЕРЫ НЕ ВХОДИЛИ В ДНИ, КОТОРЫЕ МОГУТ ПОМОЧЬ ЕЩЕ.Таким образом, я бы перечислил все события, и единственная область, которая будет равна чему-либо отличному от 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 ("eventid", "Small");

Идентификатор событиявыбирается циклом MySQL Fetch Array, зацикливая события, которые у меня есть в моей базе данных (отсюда также берется идентификатор события).

Событие 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
Helping = 0

и т.д ...

== ЧТО Я ХОЧУ СДЕЛАТЬ ==

ЕСЛИ пользователь, Боб, был указан в Событии 1 - он мне не нуженучитывается в любом другом событии.Количество таково, что я могу принести правильное количество футболок на каждое мероприятие для распространения.Так что это может сказать мне, что мне нужно 50 маленьких, 10 больших, 40 средних.

Если Боб посещает Событие 1, он получит свою футболку, поэтому ему не нужно, чтобы я принес другую (таким образом,быть подсчитанным) в любом другом событии.

Итак, по сути, мне нужно ТОЛЬКО добавить 1 к счету num_rows, ЕСЛИ «Боб» не имеет «Helping = '1'» для любых предыдущих событий.

Надеюсь, я объяснил это достаточно хорошо.

Может кто-нибудь помочь?

Ответы [ 5 ]

0 голосов
/ 22 февраля 2012

Я решил не поворачивать таблицу для вас, а сделать запрос простым (для оптимизации), хотя и долгим. Я сделал это как три отдельных запроса, по одному для каждого размера, затем соединил их с помощью 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.

0 голосов
/ 22 февраля 2012

Я должен был предположить, что ваша таблица 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

0 голосов
/ 22 февраля 2012

Я думаю, что понимаю (не слишком уверен, хотя).попробуйте выбрать DISTINCT ID пользователя.Таким образом, идентификатор пользователя выбирается только один раз.

0 голосов
/ 22 февраля 2012

Если вы просто пытаетесь выяснить, сколько рубашек каждого размера вам нужно, то вам просто нужно найти всех людей, которые в настоящее время зарегистрированы, чтобы помочь в любом случае, а затем сгруппировать по размеру рубашки.Как то так:

SELECT size,count(*) FROM helpers,users WHERE helpers.user_id = users.user_id GROUP BY size;
0 голосов
/ 22 февраля 2012

вы можете group_by u.userid, который может помочь.

...