[英]mysql id exists in this table or that table
我正在查询mysql数据库。 我有3张桌子:
官员们
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 | |
我想同时查询游戏表和事件表,以查看ID是否存在给定日期。 如果它在一个或两个中,我想返回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
)
它返回的是该日期的所有ID,而不是我请求的ID。
任何帮助将不胜感激。 我希望我描述得足够好吗?
也许是这样的:
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
)
也许:奇怪的是,您还没有在游戏表中查看UMP。 如果您需要返回有关游戏或事件的其他数据,我曾经使用过存在联接。
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
我猜您希望所有ID为4的官员在games
或events
存在相应的行。 如果真是这样,那么您需要在存在的条件周围加上括号,因为如果没有括号,查询将返回官方ID为4且games
存在对应行的所有行以及官方(具有任何ID)具有对应行的所有行在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
)
)
我认为您被AND
和OR
逻辑运算符之间的优先顺序所困扰。
SELECT 0 AND 1 OR 1
, (0 AND 1) OR 1
, 0 AND (1 OR 1)
通过在AND / OR条件周围添加括号,您可以明确指定要对其进行评估的优先级顺序。
这似乎是有效的查询。
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
)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.