2015-07-13 4 views
1

Мне удалось создать следующий сценарий «цитата дня». Проверьте www.kakivi.de, где вы можете увидеть внизу справа «kindersprüche». Настоящий запрос работает нормально, пока все идентификаторы являются последовательными. Когда один или несколько идентификаторов отсутствуют (поскольку записи были удалены), сценарий явно не будет возвращать цитату для определенного идентификатора, которого нет. Вопрос: как я могу сделать нижеприведенный скрипт «пропустить» идентификаторы, которые отсутствуют? Спасибо за ваши советы и предложения заранее.mysql quote of day query: cope with missing id's

SELECT id, spruch, vorname, nachname, datum_eintrag FROM kindersprueche 
WHERE id=`datediff`(CURDATE(),'2015-02-22') MOD (SELECT COUNT(*) 
FROM kindersprueche) 
+1

Вы используете PHP для вызова базы данных и визуализации данных? Вы можете использовать PHP для проверки вывода и запуска другого запроса, когда это необходимо. – kittykittybangbang

+0

Можете ли вы подробнее объяснить, как получить цитату? Вы запрашиваете определенный идентификатор? –

+0

yep, я запрашиваю идентификатор. Но когда этот идентификатор отсутствует в таблице, потому что связанная цитата уже удалена, никакая цитата не будет показана. Так, например: настоящие ID: 1,2, 6,7,8 и так далее. В настоящем сценарии, когда ID = 3,4 или 5, никакая цитата не будет показана. Я хотел бы, чтобы сценарий выбирал ID = 6 после ID = 2 вместо ID = 3. Кстати: я буду помнить о предложении Китти. Однако было бы здорово разрешить это прямо с запросом «в первый раз» ;-) –

ответ

0

Вы могли бы сделать что-то вроде этого:

SELECT id, spruch, vorname, nachname, datum_eintrag 
FROM kindersprueche CROSS JOIN 
    (SELECT MAX(id) as maxid FROM kindersprueche) n 
WHERE id >= datediff(CURDATE(), '2015-02-22') MOD (maxid + 1) 
ORDER BY id 
LIMIT 1; 

Обратите внимание, что я изменил условия использования MAX(id), а не COUNT(*). Я также переместил его в предложение FROM, поэтому его легче прочитать.

EDIT:

Я думаю, что способ исправить это добавить последовательный столбец в кавычки. Вы можете сделать это в запросе как:

SELECT id, spruch, vorname, nachname, datum_eintrag 
FROM (select k.*, (@rn := @rn + 1) as seqnum 
     from kindersprueche cross join (select @rn := 0) params 
    ) k CROSS JOIN 
    (SELECT count(*) as cnt FROM kindersprueche) n 
WHERE id >= datediff(CURDATE(), '2015-02-22') MOD (cnt + 1) 
ORDER BY id 
LIMIT 1; 

Другие способы решения этого:

  • Добавить столбец, последовательный (возможно автоматическое приращение) в таблицу и не установить его таким образом, есть нет пробелы.
  • Используйте offset вместе с limit, чтобы получить значения. Однако вам нужно установить это на уровне приложения, а не просто в запросе.
+0

wow, спасибо большое, ваш запрос работает сказочно !!! От имени всех детей из St.Vinzenz KInderhaus (www.kakivi.de): Большое спасибо! –

+0

Я был слишком рано с заключением, что все работает нормально. Сейчас проблема частично решена. По крайней мере, для каждого идентификатора будет показана цитата, которая намного лучше, чем просто ничего не показывать. Однако для отсутствующих идентификаторов сценарий переходит к первому идентификатору и показывает соответствующую цитату. Означает, что, если отсутствуют 4 идентификатора (где каждый идентификатор представляет день), сценарий будет показывать для тех недостающих идентификаторов одну и ту же цитату. На практике: в течение четырех дней вы увидите цитату четвертого дня (ID1, ID2, ID3 и ID4 будут показывать цитату ID5). Есть идеи, как это решить? –