2015-01-09 2 views
0

Я запрашиваю mysql db. У меня есть 3 таблицы:mysql id существует в этой таблице или в этой таблице

Чиновники

id | first | last 
------------------ 
1 | jim | smith 
2 | john | Doe 
3 | larry | toad 
4 | Dave | Charles 

Игры

id | gm_date | league | REF | UMP 
-------------------------------- 
1 | 2015-03-27 | 1  | 4 | 
2 | 2015-03-28 | 1  |  | 
3 | 2015-03-29 | 1  |  | 
4 | 2015-04-01 | 1  |  | 2 

События

id | date  | league | off | 
-------------------------------- 
1 | 2015-03-27 | 1  | 1 | 
2 | 2015-03-28 | 1  |  | 
3 | 2015-03-29 | 1  |  | 
4 | 2015-04-01 | 1  |  | 

Я хочу запросить запрос как таблицу игр и таблицы событий, чтобы увидеть, если идентификатор есть для заданной даты. Если это один или оба, я хотел бы вернуть true.

Вот мой запрос до сих пор, но он, похоже, не работает.

SELECT id , first , last 
        FROM officials AS o 
        WHERE o.id = 4 && 
        EXISTS (

        SELECT * 
        FROM games AS g 
        WHERE g.REF = o.id && g.gm_date = '2015-03-27' && g.league = 1 
        ) || 
        EXISTS (

        SELECT * 
        FROM events as e 
        WHERE e.off = o.id && e.date = '2015-03-27' && e.league = 1 
        ) 

Он возвращает все идентификаторы для даты, а не идентификатор, который я запрашиваю.

Любая помощь была бы принята с благодарностью. Надеюсь, я описываю достаточно хорошо?

+0

У плохого Чарльза нет id :( – Jonast92

+0

'ОТ должностных лиц AS o' должно быть' ОТ должностных лиц o', поскольку вы идентифицируете сокращенную таблицу, а не идентификатор столбца. - или это действительно работает в обоих случаях? – Jonast92

+0

Я не уверен, как отредактировать исходный вопрос, но я внес изменения и удалил AS. Это не имело никакого отношения к тому же ответу. – user16454

ответ

0

Может быть что-то вроде этого:

SELECT 
    id , 
    first , 
    last 
FROM officials AS o 
WHERE o.id = 4 
AND 
(
    SELECT 
     NULL 
    FROM 
     games AS g 
    WHERE 
     g.REF = o.id 
     AND g.gm_date = '2015-03-27' 
     AND g.league = 1 
    UNION ALL 
    SELECT 
     NULL 
    FROM 
     events as e 
    WHERE 
     e.off = o.id 
     AND e.date = '2015-03-27' 
     AND e.league = 1 
) 
+0

Спасибо! Не совсем, но достаточно близко, чтобы исправить. – user16454

0

Возможно: Кажется странным, что вы также не глядя на УМЗ в таблице игр. Я использовал соединение, потому что вам нужно вернуть дополнительные данные об игре или событии.

SELECT o.id, o.first, o.last 
FROM officials o 
LEFT JOIN Games g 
    on g.Ref = O.id 
and g.gm_date = '2015-03-27' 
and g.league = 1 
LEFT JOIN Events e 
    on e.Off = O.Id 
and e.league = 1 
and e.date = '2015-03-27' 
GROUP BY o.id, o.first, o.last 
-1

Это запрос, который, кажется, работает.

SELECT 
     id , 
     first , 
     last 
    FROM officials AS o 
    WHERE o.id = 4 
    AND 
    (
     SELECT 
      g.REF 
     FROM 
      games AS g 
     WHERE 
      g.REF = o.id 
      AND g.gm_date = '2015-03-27' 
      AND g.league = 1 
     UNION ALL 
     SELECT 
      e.off 
     FROM 
      events as e 
     WHERE 
      e.off = o.id 
      AND e.date = '2015-03-27' 
      AND e.league = 1 
    ) 
+0

Вы должны были перенести и выбрать ответ предоставлен вам как лучший ответ, вместо этого вы скопировали и вложили чужой ответ в свой собственный новый ответ ... – skrilled

0

Я предполагаю, что вы хотите, чтобы все должностные лица с идентификатором 4, где соответствующая строка существует в games или в events. Если это так, то вам нужны скобки вокруг существующих условий, потому что без круглых скобок запрос возвращает все строки, где официальный идентификатор равен 4, а соответствующая строка существует в games плюс все строки, где официальный (с любым идентификатором) имеет соответствующий строка в events

SELECT id , first , last 
FROM officials AS o 
WHERE o.id = 4 && 
(
    EXISTS (
     SELECT * 
     FROM games AS g 
     WHERE g.REF = o.id && g.gm_date = '2015-03-27' && g.league = 1 
    ) || EXISTS (
     SELECT * 
     FROM events as e 
     WHERE e.off = o.id && e.date = '2015-03-27' && e.league = 1 
    ) 
) 
0

Я думаю, что вы укусов порядке старшинства между AND и OR логических операторов.

SELECT 0 AND 1 OR 1 
    , (0 AND 1) OR 1 
    , 0 AND (1 OR 1) 

Добавление скобок вокруг и/или условий позволяют явно указать порядок старшинства вы хотите, чтобы они оценили.