Задавайте вопросы, мы ответим
Вы не зашли.
Добрый день.
Как возможно составить запрос на SELECT с возможностью проверки существования перевода записи, и если нет перевода, то показать запись по умолчанию. Более детально нарисовал на картинке.
http://hostingkartinok.com/show-image.p … b90c4f75d0
Спасибо.
Отредактированно Slorvengo (03.04.2014 16:03:46)
Неактивен
where now_lang_id in (-1, 0, 3) order by field (now_lang_id, 3, 0, -1) limit 1;
Неактивен
Идею, вроде бы понял.
Но у меня может быть выборка нескольких записей.
Неактивен
Наверное немного не корректно сформулировал вопрос и очень сложно.
Если нет записи column = 3 то берется запись column = 0
Если нет записи column = 0 то берется запись column = -1
Вычитал , что есть ORDER BY if(column='3',0,-1)
Но в выборку все равно попадают записи и с 0, и с -1
--
Проблема в том, что если я сделаю так:
WHERE (sys_language_uid = '2' OR sys_language_uid = '0' OR sys_language_uid = -1)
То у меня в выборку SELECT попадут и 2, и 0, и -1
А надо что бы было это как взаимоисключение, если в записи не найдено значение 2, то берется 0, если не найдено и с 0, то берется -1, в остальных условиях, эта запись (и) в выборку не попадают.
Отредактированно Slorvengo (07.04.2014 11:26:30)
Неактивен
чтобы ограничить выборку нужно использовать limit
Неактивен
C Limit-к сожалению не подходит, хотя и рад бы его использовать.
Вот образец:
Здесь если lang_id = 0 - язык по умолчанию, если = 2 - UA, если = 3 - EN.
CREATE TABLE `__TEXT_TABLE_LANG__` ( `page_id` int(11) NOT NULL AUTO_INCREMENT, `page_title` tinytext, `lang_id` int(11) NOT NULL DEFAULT '0', `lang_parent_record_id` int(11) NOT NULL DEFAULT '0', PRIMARY KEY (`page_id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8; INSERT INTO `__TEXT_TABLE_LANG__` (`page_id`, `page_title`, `lang_id`, `lang_parent_record_id`) VALUES (17, 'Главная', 0, 0), (8, 'О компании (здесь перевод на UA не выполнен, и по этой причине должна показаться данная запись-по умолчанию)', 0, 0), (26, 'Контакты ', 0, 0), (16, 'О компании [EN]', 3, 8), (48, 'Контакты [UA]', 2, 26), (49, 'Контакты [EN]', 3, 26), (52, 'Главная [UA]', 2, 17), (53, 'Главная [EN]', 3, 17), (56, 'Новости', 0, 0), (57, 'Новости [UA]', 2, 56), (59, 'Новости [EN]', 3, 56); -- 2014-04-08 08:13:52
И вот запрос, который составил - на выборку "О компании" на языке EN, но т.к. языка EN-нет, то должна выбраться запись по умолчанию:
SELECT *, #1 IF(lang_id <= '0', page_id, lang_parent_record_id) as temp_record_localization FROM `__TEXT_TABLE_LANG__` WHERE `page_title` LIKE '%О компании%' AND #2 lang_id IN(3,0) #3 ORDER BY lang_id DESC
Думал сделать ORDER BY lang_id DESC, и сделать группировку по полую temp_record_localization, но к сожалению группировка происходит перед ORDER и по этой причине это не возможно так реализовать.
Может быть как-то с Having или CASE можно решить данную задачу?
Пробовал еще WHERE FIND_IN_SET - но он не работает также как в ORDER FIND_IN_SET
Отредактированно Slorvengo (08.04.2014 10:30:20)
Неактивен
Не очень понятно какую задачу нужно решить.
Приведенный вами пример решается с помощью замены
ORDER BY lang_id DESC
на
order by field (lang_id, 3, 0, -1) limit 1;
Если есть более сложный случай, когда такой прием не подходит, то приведите пример.
Неактивен
Примеры:
- выбрать список всех страниц сайта с учетом переводов (в т.ч. для построения sitemap.xml)
- выбрать список подразделов раздела с учетом переводов
- выбрать страницы по фильтру (размер квартиры > 50, тип строения = 'монолит') с учетом переводов
--
По этой причине limit = 1 - замечательно работает, но не для вышеприведенных случаев. Но не для примеров выше, когда нужно сделать SELECT всех имеющихся записей.
Есть также вариант мне после вышеприведенного запроса делать проверку уже на PHP и если нет перевода, брать запись по умолчанию.
Но хотелось бы сделать на уровне MySQL.
Думал сделать так, но это тоже не работает - MAX-почему-то не реагирует ни как и выдает 0 результат.
HAVING (temp_record_localization = page_id OR temp_record_localization = lang_parent_record_id) AND lang_id = MAX(lang_id)
Неактивен
Так понимаю, что к сожалению придется мне записи как то сортировать после на PHP
и доработать данный запрос на основе MySQL не получится.
Неактивен
Может быть как-то можно сделать через
SELECT CASE id
WHEN 1 THEN 'первый'
WHEN 2 THEN 'второй'
........
END FROM table_name
Неактивен