2008-09-20 67 views
1

我有一個表y其中有兩列ab根據結果數量我可以將我的MySQL查詢重構爲一個查詢嗎?

的項目有:

a b 

1 2 

1 3 

1 4 

0 5 

0 2 

0 4 

我想2,3,4如果我搜索欄a 1和5,2, 4如果我搜索欄a

所以,如果我搜索的東西,是在A,(1)我得到的那些行,如果有給定值沒有條目A,給我的「默認」(a =「0」)

這是我怎麼會知道如何做到這一點:

$r = mysql_query('SELECT `b` FROM `y` WHERE `a` = \'1\';'); 
//This gives desired results, 3 rows 

$r = mysql_query('SELECT `b` FROM `y` WHERE `a` = \'2\';'); 
//This does not give desired results yet. 
//Get the number of rows, and then get the 'defaults' 
if(mysql_num_rows($r) === 0) $r = mysql_query('SELECT `b` FROM `y` WHERE `a` = 0;'); 

所以,現在,它的充分的解釋,我怎麼做,在一個查詢和性能怎麼樣的關注?

使用最多的部分將是第三個查詢,因爲只有a中的數值爲IF,您偏離默認值。

回答

2

我想我有它:

SELECT b FROM y where a=if(@value IN (select a from y group by a),@value,0); 

它檢查是否@value存在於表中,如果沒有,那麼它使用0作爲默認值。 @@@@也可以是一個php值。

希望它能幫助:)

0

您可以使用單個參數在單個存儲過程中執行所有操作。

我必須用完,但我會盡力爲你寫一個,並在我從我的差事中回來後立即添加。

+0

大。當談到存儲過程時,我完全無能爲力。 一般來說,我只會問,如果在存儲過程中執行它會比我上面提出的PHP版本更好。我的本能會說'是的,如果數據庫是在不同的服務器上,而不是其他'。 – 2008-09-20 15:16:56

+0

存儲過程總是更好。其他人給出的解決方案都很好,但是,一般情況下,向客戶端發送儘可能多的信息以回報您所需的信息,因爲您需要的信息一般都很好,如果客戶端是單獨的計算機,則無關緊要比服務器 – 2008-09-20 18:59:18

0

我不知道爲什麼這是標記 - 請教育我。這是一個有效的,經過測試的存儲過程,我回答了這個問題。 OP沒有要求在PHP中回答。 ??

這是一個存儲過程,可以在SQL Server中執行您想要的操作。我不確定MySQL。

create proc GetRealElseGetDefault (@key as int) 
as 
begin 

-- Use this default if the correct data is not found 
declare @default int 
select @default = 0 

-- See if the desired data exists, and if so, get it. 
-- Otherwise, get defaults. 
if exists (select * from TableY where a = @key) 
    select b from TableY where a = @key 
else 
    select b from TableY where a = @default 

end -- GetRealElseGetDefault 

您將與

GetRealElseGetDefault 1

基於一個快速谷歌搜索運行這個(在SQL Server),存在快速在MySQL。列A被編入索引會特別快。如果你的桌子足夠大讓你擔心表現,那麼它可能足夠大以便進行索引。

+0

我不知道爲什麼這被標記 - 請教育我。這是一個有效的,經過測試的存儲過程,我回答了這個問題。 OP沒有要求在PHP中回答。 ?? – CindyH 2008-09-22 13:48:24

2

你可以嘗試這樣的事情。我不是100%確定它會工作,因爲count()是一個聚合函數,但它值得一試。

SELECT b 
FROM table1 
WHERE a = (
    SELECT 
    CASE count(b) 
     WHEN 0 THEN :default_value 
     ELSE :passed_value 
    END 
    FROM table1 
    WHERE a = :passed_value 
) 
+0

我想我不能接受兩個答案,但這些都是正確的,我測試了他們,並且我已經儘可能最好地投票了他們。 – 2008-09-20 18:35:04

1

什麼

$rows = $db->fetchAll('select a, b FROM y WHERE a IN (2, 0) ORDER BY a DESC'); 
if(count($rows) > 0) { 
    $a = $rows[0]['a']; 
    $i = 0; 
    while($rows[$i]['a'] === $a) { 
    echo $rows[$i++]['b']."\n"; 
    } 
} 

一個查詢,但如果開銷有很多 '零' 值。
如果你關心的開銷取決於...

1

我想在基於服務器的性能我看來米哈爾KRALIK最好的答案。對這種簡單的邏輯進行子選擇或存儲過程確實是不值得的。

我會改進Michal邏輯的唯一方法是如果您在一個腳本中多次執行此查詢。在這種情況下,我會首先查詢0,然後運行每個單獨的查詢,然後檢查是否有任何值。

僞代碼

// get the value for hte zero's 
$zeros = $db->fetchAll('select a, b FROM y WHERE a = 0'); 

//checking for 1's 
$ones = $db->fetchAll('select a, b FROM y WHERE a = 1'); 
if(empty($ones)) $ones = $zeros; 

//checking for 2's 
$twos = $db->fetchAll('select a, b FROM y WHERE a = 2'); 
if(empty($twos)) $twos = $zeros; 

//checking for 3's 
$threes = $db->fetchAll('select a, b FROM y WHERE a = 3'); 
if(empty($threes)) $threes = $zeros; 
相關問題