2012-04-11 62 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