我有一个查询返回一堆信息并使用连接来连接两个表,它完全正常。
但我有一个名为门票的字段,我需要查看是否有时间可用,如果有一个设置为1,否则将其设置为0.所以就像这样。
SELECT
name,poster,sid,tickets = (IF SELECT id FROM times WHERE shows.tid=times.tid LIMIT 1,
if value returned set to 1, otherwise set to 0)
FROM shows JOIN show_info ON (id) WHERE sid=54 order by name ASC
显然这不是一个正确的MySQL语句,但它会给出一个我正在寻找的例子。
这可能吗?或者我是否需要先执行第一次选择然后循环查看结果并按此方式执行第二次选择和设置值?或者是一个更好的表现?
答案 0 :(得分:6)
我会看EXISTS
它在大多数情况下比COUNT
所有与where语句匹配的项目快得多。照这样说。您的查询应该如下所示:
SELECT
name,
poster,
sid,
(
CASE WHEN EXISTS(SELECT NULL FROM times WHERE shows.tid=times.tid)
THEN 1
ELSE 0
END
)AS tickets
FROM
shows
JOIN show_info ON (id) WHERE sid=54 order by name ASC
答案 1 :(得分:1)
查看CASE声明
SELECT name,poster,sid,
Case WHEN (SELECT count(id) FROM times WHERE shows.tid=times.tid) > 0 THEN 1 else 0 END as Tickets
FROM shows
JOIN show_info ON (id)
WHERE sid=54 order by name ASC
答案 2 :(得分:0)
试
SELECT
name,
poster,
sid,
CASE WHEN (SELECT COUNT(*) FROM times WHERE shows.tid=times.tid ) > 0 THEN 1 ELSE 0 END CASE tickets
FROM shows
JOIN show_info ON (id)
WHERE sid=54
order by name ASC
有关CASE
的参考,请参阅MySQL Docs。
答案 3 :(得分:0)
这是我能想到的最简单的方法:
SELECT name, poster, sid,EXISTS(SELECT * times WHERE shows.tid=times.tid) tickets
FROM shows
JOIN show_info USING (id)
WHERE sid = 54
ORDER BY name