2012-04-11 99 views
0

我有一個MySQL表像MySQL的「默認」的結果

id | text | category | active 

我選擇具有

SELECT id, text 
FROM table 
WHERE category = [category id] AND active = 1 
ORDER BY RAND() 
LIMIT 1 

有些時候,隨機線,這將不返回任何結果(例如,如果沒有活動的行一個特定的類別)。在這種情況下我需要做的是返回一個「默認」行。

我的問題是:什麼是最有效的方法來做到這一點?我應該創建一個相同的表,但只是使用默認行,如果上述查詢沒有提供結果,我會查詢這些行嗎?還是應該在同一個表中添加默認行?你會如何查詢它?

歡迎任何建議!

編輯 一些更新的問題:

  1. 我排除發生在PHP中的默認文本的可能性,因爲我希望它是定製的,而不必去改變碼。

  2. 會有每個類別

回答

2

什麼是你想要的默認值?表中的第一個ID?

SELECT id, text 
FROM ( SELECT id, categori, active, text, 0 AS prio 
     FROM table WHERE category = [category id] AND active = 1 
     UNION ALL 
     SELECT id, categori, active, text, 1 
     FROM table 
     ORDER BY id ASC 
     LIMIT 1) AS h 
ORDER BY prio, RAND() 
LIMIT 1 

如果您希望在某個默認值,添加一個ENUM列名爲default('TRUE', 'FALSE')

SELECT id, text 
FROM ( SELECT id, categori, active, text, 0 AS prio 
     FROM table WHERE category = [category id] AND active = 1 AND default = 'FALSE' 
     UNION ALL 
     SELECT id, categori, active, text, 1 
     FROM table 
     WHERE category = [category id] AND default = 'TRUE' 
     ORDER BY id ASC 
     LIMIT 1) AS h 
ORDER BY prio, RAND() 
LIMIT 1 

更容易之一:

SELECT id, text 
FROM table 
WHERE category = [category id] AND (active = 1 OR default = 'TRUE') 
ORDER BY (default = 'FALSE') DESC, RAND() 
LIMIT 1 

說明:
Basicly這查詢提取所有你計數的行獲取並將其與默認行組合。他們每個都得到一個prio值,你在做RAND()之前先訂購它們。剩下的事情就是你想如何存儲你的默認行。

+0

嗯,這似乎是要走向我所需要的 – nico 2012-04-11 07:20:34

+0

我已經添加了一些解釋。讓我知道你是否需要更多的例子。 – 2012-04-11 07:25:54

+0

我會做一些測試,謝謝! – nico 2012-04-11 07:27:57

0

你的意思是一個「默認行」設置默認行?我不確定我是否明白你的意思。但是如果你說要反正輸出某些東西,即使沒有任何結果,我也只是用程序來做。

只要檢查您是否有數據結果集,如果沒有,則通過腳本輸出內容。

+0

我在問題中添加了一條評論 – nico 2012-04-11 07:13:32

0

取決於你所使用的語言,你可以只看到有多少行被返回:

// php 

$res = mysql_query("..."); 

if(mysql_num_rows($res) < 1) 
{ 
    // no result 
} 
else 
{ 
    // do something 
} 
+0

請參閱問題的最後一句。默認結果需要可定製 – nico 2012-04-11 07:14:18

3
SELECT id, text 
FROM table 
WHERE (category = [category id] AND active = 1) 
    OR ((DEFAULT CONDITION) AND NOT((category = [category id] AND active = 1))) 
ORDER BY RAND() 
LIMIT 1 
+0

這是不是可以通過隨機抽取默認值,而不是隻有在不滿足第一個條件的情況下? – 2012-04-11 07:18:28

+0

我不確定我是否理解這個查詢...我沒有默認條件,我有一個默認結果。我錯過了什麼嗎? – nico 2012-04-11 07:19:43

+0

不要採取'DEFAULT CONDITION'字面值。這是一個例子,你可以通過一定的條件來過濾行,從而獲取你的默認行。 – 2012-04-11 07:22:00