5

大量の情報を返し、結合を使用して 2 つのテーブルを結合するクエリがあり、完全に正常に動作します。

しかし、利用可能な時間があるかどうかを確認する必要があるチケットと呼ばれるフィールドがあり、1 つでもあれば 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 ステートメントではありませんが、私が探しているものの例を示しています。

これは可能ですか?または、結果をループするために最初の選択を行い、2番目の選択を行い、そのように値を設定する必要がありますか? それとも、より優れたパフォーマンスが賢明ですか?

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

のリファレンスについては、 MySQLDocsCASEを参照してください。

于 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 に答える