проблема минус в MySQL в вычитании данных группы - PullRequest
0 голосов
/ 29 апреля 2011

у меня есть три участника таблицы ( memberid , m_name, statusid, адрес, DOB, телефон) бронирование ( bookingid , memberid, sessionid, стоимость) сеанс ( sessionid , активность, местоположение)

(fk memberid, fk sessionid) БРОНИРОВАНИЕ - это связь с (member pk) и (session pk)

сессионная активность похожа на футбол, плавание, бадминтон, теннися хочу выполнить следующий запрос

найти имя всех участников, которые забронировали какой-либо сеанс для «футбола», но не для какого-либо сеанса для «плавания» в декабре 2009 года

sql


 select DISTINCT  Event1.m_name ,Event1.activity
       FROM
       (
            select mm.m_name,ss.activity,ss.sessionid,ss.s_date
                 from member mm
                 inner join booking bb on bb.memberid = mm.memberid
                 inner join session ss   on ss.sessionid = bb.sessionid
                where activity = 'football'
       )as Event1

INNER JOIN
    (
         select mm.m_name ,ss.activity,ss.sessionid,ss.s_date
               from member mm
               inner join booking bb on bb.memberid = mm.memberid
               inner join session ss  on ss.sessionid = bb.sessionid
               where mm.memberid not in
                   (
                    select mm.memberid
                    from member mm
                     inner join booking bb
                     on bb.bookingid = mm.memberid
                     inner join session ss
                     on bb.sessionid = ss.sessionid
                     where ss.activity in ( 'swimming')
             )

     ) as Event2

on Event1.sessionid = Event2.sessionid

что я делаю не так, верни мне член, у которого есть книга по футболу и покер.

Ответы [ 3 ]

0 голосов
/ 30 апреля 2011
SELECT m_name
FROM members
WHERE memberid IN
  ( SELECT b.memberid
    FROM booking b
      JOIN session s
        ON s.sessionid = b.sessionid
    WHERE s.activity = "football"
  )
AND memberid NOT IN
  ( SELECT b.memberid
    FROM booking b
      JOIN session s
        ON s.sessionid = b.sessionid
    WHERE s.activity = "swimming"
  )

или

SELECT m.m_name
FROM members m
WHERE EXISTS
  ( SELECT 0
    FROM booking b
      JOIN session s
        ON s.sessionid = b.sessionid
    WHERE s.activity = "football"
      AND b.memberid = m.memberid
  )
AND NOT EXISTS
  ( SELECT 0
    FROM booking b
      JOIN session s
        ON s.sessionid = b.sessionid
    WHERE s.activity = "swimming"
      AND b.memberid = m.memberid
  )

или

SELECT m.m_name
FROM booking b 
  JOIN members m
    ON m.memberid = b.memberid
  JOIN session s
    ON s.sessionid = b.sessionid
WHERE s.activity IN ("football", "swimming")
GROUP BY b.memberid
HAVING COUNT(s.activity = "swimming") = 0
0 голосов
/ 30 апреля 2011

Это выглядит подозрительно:

резервирование внутреннего соединения bb на bb.bookingid = mm.memberid

0 голосов
/ 29 апреля 2011
SELECT
m_name,
(
    SELECT COUNT(bookingid)
    FROM booking
    WHERE memberid = ROOT.memberid
    AND sessionid = [session.sessionid for football]
) AS FootballSessions,
(
    SELECT COUNT(bookingid)
    FROM booking
    WHERE memberid = ROOT.memberid
    AND sessionid = [session.sessionid for swimming]
) AS SwimmingSessions
FROM member ROOT
HAVING FootballSessions > 0
AND SwimmingSessions = 0

Возможно, вам придется сказать WHERE вместо HAVING в конце, но это должно сработать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...