2012-04-15 55 views
4

我有一個查詢返回一堆信息,並使用連接來連接兩個表,它工作得很好。MySql如果存在設置值?

但我有一個叫做票的字段,我需要看看是否有時間可用,如果有甚至一個將其設置爲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語句,但它會舉例說明我在找什麼。

這可能嗎?或者我需要做第一次選擇,然後通過結果進行循環,然後執行第二次選擇並設置值?或者是更好的表現呢?

回答

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

看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 
+0

我一直在尋找的東西有,將有一個「X」,如果行中的一個存在一列返回一個列表表格,如果沒有,則爲空白。 CASE的這種用法就是我所需要的。 – 2013-04-12 22:39:05

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

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