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

Некоторые времена это не будет возвращать никаких результатов (не, например, если нет активной строки в конкретная категория). То, что мне нужно сделать в этом случае, - это вернуть строку по умолчанию.

Мой вопрос: какой самый эффективный способ сделать это? Должен ли я просто создать идентичную таблицу, но только с строками по умолчанию, которые я бы запросил, если приведенный выше запрос не дает никаких результатов? Или я должен добавить строки по умолчанию в одну и ту же таблицу? И как бы вы запросили его?

Любые предложения приветствуются!

EDIT Несколько обновлений на вопрос:

  1. Я исключающие возможность генерации текста по умолчанию в PHP, как я хочу, чтобы это было настраиваемым, без необходимости идти и менять код.

  2. Там будет строка по умолчанию для каждой категории

ответ

2

Что такое значение по умолчанию вы хотите? 1-й идентификатор в таблице?

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 

Объяснение:
Основном это запрос извлекает все строки, на которые вы рассчитываете t o get и объединить его со строкой по умолчанию. Они получили значение prio, которое вы заказываете, прежде чем делать RAND(). Остается то, как вы хотите сохранить свои строки по умолчанию.

+0

Хммм это похоже на то, что мне нужно – nico

+0

Я также добавил немного объяснений. Дайте мне знать, если вам нужно больше примеров. –

+0

Я сделаю некоторые тесты, спасибо! – nico

0

Как вы имеете в виду «по умолчанию строку»? Я не совсем уверен, получу ли вы то, что вы имеете в виду. Но если вы говорите, что хотите что-то вывести, даже если результатов нет, я бы просто сделал это программно.

Просто проверьте, есть ли у вас набор результатов с данными, если нет, выведите что-то через скрипт.

+0

Я добавил комментарий на этот вопрос в вопрос – nico

0

В зависимости от того, какой язык вы используете, вы можете просто посмотреть, сколько записей были возвращены:

// php 

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

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

См. Последнее предложение в вопросе. Результаты по умолчанию должны быть настраиваемыми – nico

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

Разве это не могло бы сделать значение по умолчанию случайным, и не только, если 1-ые условия не выполняются? –

+0

Я не уверен, что понимаю этот запрос ... У меня нет условия по умолчанию, у меня есть результат по умолчанию. Я что-то упускаю? – nico

+0

Не используйте литерал 'DEFAULT CONDITION'. Это пример того, что вы можете отфильтровать строку по определенному условию, которое будет извлекать вашу строку по умолчанию. –

Смежные вопросы