SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 03.04.2014 16:03:26

Slorvengo
Завсегдатай
Зарегистрирован: 08.08.2013
Сообщений: 46

Запрос с проверкой существования перевода записи

Добрый день.

Как возможно составить запрос на SELECT с возможностью проверки существования перевода записи, и если нет перевода, то показать запись по умолчанию. Более детально нарисовал на картинке.
http://hostingkartinok.com/show-image.p … b90c4f75d0

Спасибо.

Отредактированно Slorvengo (03.04.2014 16:03:46)


Прикрепленные файлы:
Attachment Icon translation.png, Размер: 48,223 байт, Скачано: 428

Неактивен

 

#2 03.04.2014 18:13:41

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5831

Re: Запрос с проверкой существования перевода записи

where now_lang_id in (-1, 0, 3) order by field (now_lang_id, 3, 0, -1) limit 1;

Неактивен

 

#3 04.04.2014 15:24:37

Slorvengo
Завсегдатай
Зарегистрирован: 08.08.2013
Сообщений: 46

Re: Запрос с проверкой существования перевода записи

Идею, вроде бы понял.
Но у меня может быть выборка нескольких записей.

Неактивен

 

#4 07.04.2014 11:20:40

Slorvengo
Завсегдатай
Зарегистрирован: 08.08.2013
Сообщений: 46

Re: Запрос с проверкой существования перевода записи

Наверное немного не корректно сформулировал вопрос и очень сложно.

Если нет записи 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)

Неактивен

 

#5 07.04.2014 11:30:37

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5831

Re: Запрос с проверкой существования перевода записи

чтобы ограничить выборку нужно использовать limit

Неактивен

 

#6 08.04.2014 10:19:20

Slorvengo
Завсегдатай
Зарегистрирован: 08.08.2013
Сообщений: 46

Re: Запрос с проверкой существования перевода записи

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)


Прикрепленные файлы:
Attachment Icon sql-result.PNG, Размер: 39,491 байт, Скачано: 391

Неактивен

 

#7 08.04.2014 11:34:12

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5831

Re: Запрос с проверкой существования перевода записи

Не очень понятно какую задачу нужно решить.
Приведенный вами пример решается с помощью замены
ORDER BY lang_id DESC
на
order by field (lang_id, 3, 0, -1) limit 1;

Если есть более сложный случай, когда такой прием не подходит, то приведите пример.

Неактивен

 

#8 08.04.2014 13:28:47

Slorvengo
Завсегдатай
Зарегистрирован: 08.08.2013
Сообщений: 46

Re: Запрос с проверкой существования перевода записи

Примеры:

- выбрать список всех страниц сайта с учетом переводов (в т.ч. для построения 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)

Неактивен

 

#9 13.04.2014 10:50:18

Slorvengo
Завсегдатай
Зарегистрирован: 08.08.2013
Сообщений: 46

Re: Запрос с проверкой существования перевода записи

Так понимаю, что к сожалению придется мне записи как то сортировать после на PHP
и доработать данный запрос на основе MySQL не получится.

Неактивен

 

#10 13.04.2014 10:53:22

Slorvengo
Завсегдатай
Зарегистрирован: 08.08.2013
Сообщений: 46

Re: Запрос с проверкой существования перевода записи

Может быть как-то можно сделать через
SELECT CASE id
   WHEN 1 THEN 'первый'
   WHEN 2 THEN 'второй'
   ........
END FROM table_name

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson