0

我有一个 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. 每个类别将有一个默认行

4

4 回答 4

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
于 2012-04-11T07:15:06.737 回答
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

说明:
基本上,这个查询会获取您指望获取的所有行,并将其与默认行结合起来。他们每个都有一个优先价值,你在做之前订购它们RAND()。剩下的就是您希望如何存储默认行。

于 2012-04-11T07:14:33.167 回答
0

你是什​​么意思“默认行”?我不确定我是否明白你的意思。但是,如果您说无论如何都想输出某些东西-即使没有任何结果-,我也会以编程方式进行。

只需检查您是否有带有数据的结果集,如果没有,则通过脚本输出一些内容。

于 2012-04-11T07:13:00.530 回答
0

根据您使用的语言,您可以看到返回了多少行:

// php

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

if( mysql_num_rows($res) < 1 )
{
  // no result
}
else
{
  // do something
}
于 2012-04-11T07:13:36.430 回答