5

我有一个查询返回一堆信息并使用连接来连接两个表,它工作得很好。

但是我有一个名为tickets的字段,我需要查看是否有可用的时间,如果有的话,将其设置为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 语句,但它会给出我正在寻找的示例。

这可能吗?或者我是否需要进行第一次选择,然后循环遍历结果,然后进行第二次选择并以这种方式设置值?或者更好的表现是明智的?

4

4 回答 4

10

我会看看在大多数情况下,它比与你的 where 语句匹配的所有项目EXISTS要快得多。COUNT照这样说。您的查询应如下所示:

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
于 2012-04-15T15:50:21.810 回答
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
于 2012-04-15T15:50:53.767 回答
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

于 2012-04-15T15:51:59.053 回答
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
于 2012-04-15T15:56:06.870 回答