2012-02-21 2 views
1

죄송합니다. 제목이 매우 모호합니다.MySQL 및 PHP - 이전에 나열되지 않은 항목 만 나열하십시오.

기본적으로 나는 뭔가 붙어 있습니다. 두 테이블에서 나열된 충분한 작업 스크립트가 있습니다.

그것은 이벤트

이벤트 1
이벤트 2
이벤트 3
이벤트 4
이벤트 5
이벤트 6

지금, 사용자가 T- 셔츠를 필요로의 목록을 가져옵니다

"전반적인"사건. 그들은 자원 봉사자이며 티셔츠를 가지고 있습니다. 청지기를 도울 수있는 행사를 제출할 때, 그들은 T 셔츠 크기를 선택하여 주문할 수 있습니다.

내가 다음 목록을

이벤트 1 :
작은 = 자원 봉사자가 자신의 티셔츠 사이즈를 입력하면
중간 =
대형 =

카운트 카운트 카운트, 그것은에 저장됩니다 자신의 윤곽. 이벤트는 이벤트라는 테이블에 저장됩니다.

그러나 그 부분은 중요하지 않습니다. 위와 같이 목록에 쉽게 표시 할 수 있으며 특정 정도까지 정확하다고 생각합니다. 문제는, 나는 Bob이라는 자원 봉사자가 있다고 말합니다. 밥의 티셔츠 사이즈는 작습니다. 그는 이벤트 1에 대해서만 자원 봉사 중입니다. 다른 자원 봉사자들도 그날을 알리지 않았으며, 그들은 아직 도움을받을 수 없습니다. 따라서 모든 이벤트가 나열되고 0 이외의 다른 부분과 동일한 유일한 영역은

이벤트 1 - 중 = 0, 중형 = 0, 대형 = 어쨌든 등 등 ....

0, 밥이 이벤트 1,2,3에 도움, 5

그런 다음 이벤트 1을 보여주는 결정 말 - 작은 = 1, 보통 = 0, Large = 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", "작은")와 같은 기능을 가진;

MySQL 데이터베이스 가져 오기 이벤트 루프는 이벤트 ID를 가져 오며 이벤트 ID는 데이터베이스에서 가져온 이벤트를 반복합니다.

이벤트 ID = 1 : 1 개
이벤트 ID = 2 : 2
등등그들이 도울 수있는 이벤트를 제출하면

, 그것은 101
이벤트 ID = 1
돕는 = 1

사용자 ID = 101
이벤트 ID = 2
= 사용자 ID처럼 "도우미"테이블로 전환 돕는 = 1

아이디 = 101
이벤트 ID = 3
돕는 = 1
,617,451 515,
아이디 = 101
이벤트 ID = 4
돕는 = 0

등 ...

== I는 ==에게

싶지 어떤 사용자 밥되었는지 이벤트 1에 열거 됨 - 나는 다른 어떤 사건에서도 그를 카운트 할 필요가 없다. 카운트를 통해 각 이벤트에 올바른 티셔츠를 가져다 배분할 수 있습니다. 그래서 내가 50 개의 작은, 10 개의 큰, 40 개의 매체를 필요로한다고 말할 수 있습니다.

밥이 이벤트 1에 참석하는 경우, 그는 티셔츠를 입을 것이므로 다른 이벤트에서 다른 사람을 데려 올 필요가 없습니다.

그래서 본질적으로 이전 이벤트에 대해 "Bob"에 "Helping = '1'"이없는 경우에만 num_rows 카운트에 1을 추가해야합니다.

내가 충분히 설명했으면 좋겠다.

아무도 도와 줄 수 있습니까?

+0

다른 이벤트의 셔츠가 같은가요? 이전 이벤트가 무슨 뜻이야? 더 이른 데이트? 또는 그가 선택한 이벤트의 수와 상관없이 한 명의 사용자에 대해 하나의 셔츠 만 계산 하시겠습니까? – piotrm

+0

셔츠는 각 이벤트마다 모두 동일합니다. 이전 이벤트는 이벤트 2가 이벤트 3 다음에 오는 것을 의미하며, 위의 쿼리를 기반으로 모든 이벤트에 참석하는 경우 예를 들어, 각 이벤트에 대해 "작은"1로 계산합니다. 그들이 이벤트 1에 있다면, 나는 다른 이벤트에서 카운트하지 않기를 바란다. 이미 이벤트 1에 그들에게 tshirt를 가져갈 것이다. – TheMonk

+1

이벤트 2는 무엇을 기반으로하는 이벤트 3 이후인가? – piotrm

답변

0

, 당신의 문제의 쿼리에서 다른 테이블을 추측 할 수있다.

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

안녕 piotrm, 도와 줘서 고마워. 이것은 나를 위해 일종의 일이지만, 내가 준 예제보다는 전체 시스템에 적응했습니다. 예상대로 작동하지 않습니다. 나는 이것에 관해 계속 일할 것이다. .. 그리고 그것이 내가 희망을 갖고 움직이게 할 수있을 때 답으로서 똑딱 거려 라. 당신의 도움을 주셔서 대단히 감사합니다. – TheMonk

+0

이벤트 테이블에, 나는 년 동안 ... 2009 년, 2010 년, 2011 년, 그리고 지금은 2012 년 ...이 이벤트를 위해 .... 예를 들어 올해의 이벤트 만 계산하도록 뷰를 필터링 할 수 있습니까? – TheMonk

+0

'WHERE h.helping = 1'을 'WHERE h.helping = 1 AND h.eventID> $ countfromthisID'로 변경하고 마지막 조건 전에'WHERE e.eventid> ... '와 동일한 조건을 추가하십시오 GROUP BY – piotrm

0

당신은 group_by u.userid를 사용하면 도움이 될 수 있습니다.

0

나는 이해한다고 생각한다. DISTINCT 사용자 ID를 선택하십시오. 그렇게하면 사용자 ID가 한 번만 선택됩니다.

0

필요한 크기의 셔츠가 몇 개인 지 파악하기 만하면 현재 등록 된 모든 사람들을 찾아서 이벤트에 도움을주고 셔츠 크기별로 그룹화하면됩니다. 이런 식으로 뭔가 : 나는 당신의 events 테이블 필드 eventIDevent_name을 가지고 가정했다

SELECT size,count(*) FROM helpers,users WHERE helpers.user_id = users.user_id GROUP BY size; 
+0

문제는 이벤트마다 카운트를 나열하고 싶기 때문에 이벤트 1에서 얼마나 많은 것이 필요한지 알 수 있습니다. – TheMonk

+0

헬퍼 데이터베이스에 추가되면 6 개의 이벤트가 있으므로 사용자 당 6 개의 항목이 있습니다. 1 = 참석 중, 0 = 참석하지 않음 ... user_id가 "tshirt_size"프로파일을 조인합니다. 그런 다음 eventid = 1 및 tshirt_size = small을 찾고 카운트를 요청하십시오 ... 이벤트 2로 이동하는 경우에도 해당 이벤트가 계산됩니다. 다만이 이벤트도 필요하지 않습니다. 이벤트 1 .... – TheMonk

+0

왜 이벤트 당 카운트를 원하는지 이해가 안됩니다. 실제로 카운트는 무엇을 나타 냅니까? 당신이 해결하려고하는 현실 세계의 문제가 있습니까? 각 이벤트에 몇 장의 셔츠를 가져갈 지 알아야합니까? – jasonlfunk

0

내가 당신을 위해 테이블을 선회하지 않기로하고, (최적화) 쿼리 간단한을 유지하기 위해 긴하지만.

(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 
... 

이 쿼리는 이벤트가 시간 순으로 정렬되어 있다고 가정 나는 UNION로 합류 한 후, 세 개의 쿼리, 각 크기에 대해 하나로했다 eventid.