Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Запрос на перевод категорий / 12 сообщений из 12, страница 1 из 1
28.03.2015, 10:44:33
    #38919729
NMFES
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос на перевод категорий
Таблицы в базе:

1. categories
Поля: id

Записи:
1 |
2 |

2. translates

Поля: id | category_id | language_id | title

Записи:
1 | 1 | 0 | Первая категория
2 | 1 | 1 | First category
3 | 2 | 0 | Вторая категория

В первой таблице категории, во второй перевод для категорий.
В зависимости от текущего ID языка (language_id) нужно одним запросом выбрать все категории из первой таблицы и переводы для них желательно на яыке 1, но если нет перевода на этом языке то взять название категории с ID языка 0 (который точно будет).

Примерно такое:
SELECT a.id, b.title from categories a
INNER JOIN translates b ON a.id = b.category_id
WHERE b.language_id = 1 А_ЕСЛИ_НЕТ_ТО b.language_id = 0
GROUP BY a.id

На выводе получить следующее (допустим, надо получить на английском, но если нет перевода то на русском):
1 | First category
2 | Вторая категория

Одним запросом возможно выбрать?
...
Рейтинг: 0 / 0
28.03.2015, 10:51:20
    #38919731
retvizan
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос на перевод категорий
NMFES,

Выбираете b.language_id in (0,1)
затем
FAQ: Выборка первой/последней записи в группах
...
Рейтинг: 0 / 0
28.03.2015, 11:06:02
    #38919735
NMFES
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос на перевод категорий
авторВыбираете b.language_id in (0,1)
Так уже делал, две записи захватывает.
Чтоб вторую отсечь обязательно нужно подзапрос делать?
...
Рейтинг: 0 / 0
28.03.2015, 11:06:14
    #38919736
retvizan
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос на перевод категорий
Проще
Код: sql
1.
2.
select t.category_id, t.title from
(select category_id, max(language_id) from translates where language_id in (0,1) group by 1) t1 join translates t using(category_id);
...
Рейтинг: 0 / 0
28.03.2015, 11:10:02
    #38919737
retvizan
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос на перевод категорий
джойнить по category_id и language_id
...
Рейтинг: 0 / 0
28.03.2015, 11:13:03
    #38919738
UNION ALL,
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос на перевод категорий
имхо, "банальный" UNION ALL будет лучше
Типа
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
SELECT a.id, b.title from categories a
INNER JOIN translates b ON a.id = b.category_id
WHERE b.language_id = 1

UNION ALL

SELECT a.id, b.title from categories a
INNER JOIN translates b ON a.id = b.category_id
WHERE b.language_id = 0
and not exists(select 1 from translates c where a.id = c.category_id and c.language_id = 1)


или может такой 2-й запрос будет лучше
Код: sql
1.
2.
3.
4.
5.
6.
...
SELECT a.id, b.title from categories a
INNER JOIN translates b ON a.id = b.category_id
left join translates c ON (a.id = c.category_id and c.language_id = 1)
WHERE b.language_id = 0
and c.category_id is null 



пс
ТС, в аду, держат отдельную сковородку, "усиленного нагрева", для тех, кто использует GROUP BY без агрегатов ! :)
...
Рейтинг: 0 / 0
28.03.2015, 11:32:17
    #38919741
NMFES
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос на перевод категорий
или может такой 2-й запрос будет лучше
Код: sql
1.
2.
3.
4.
5.
6.
...
SELECT a.id, b.title from categories a
INNER JOIN translates b ON a.id = b.category_id
left join translates c ON (a.id = c.category_id and c.language_id = 1)
WHERE b.language_id = 0
and c.category_id is null 



Этот не робит. Выводит все категории на языке с ИД 0, кроме той, для которой есть перевод на языке с ИД 1.

Первый запрос отрабатывает верно. Но что-то громоздко как-то :/


retvizan
Что-то у вас первая таблица вообще никак не фигурирует в запросе.
...
Рейтинг: 0 / 0
28.03.2015, 11:39:40
    #38919746
UNION ALL,
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос на перевод категорий
NMFESЭтот не робит. Выводит все категории на языке с ИД 0, кроме той, для которой есть перевод на языке с ИД 1.
Я ж написал - это 2-ой запрос в UNION-е, альтернатива запросу с exists в условии
Полностью так
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
SELECT a.id, b.title from categories a
INNER JOIN translates b ON a.id = b.category_id
WHERE b.language_id = 1

UNION ALL

SELECT a.id, b.title from categories a
INNER JOIN translates b ON a.id = b.category_id
left join translates c ON (a.id = c.category_id and c.language_id = 1)
WHERE b.language_id = 0
and c.category_id is null 


NMFESНо что-то громоздко как-то :/Это "хреновенький" критерий :)
...
Рейтинг: 0 / 0
28.03.2015, 12:00:38
    #38919751
NMFES
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос на перевод категорий
UNION ALL,,

Для перфекциониста это даже очень и очень аргумент)
2 селекта и 3 джоина на такую, казалось бы, простую операцию.

При выводе чтоли отрезать лишнее через php, а запросом тянуть перевод на обеих языках. Надо подумать.

Код: sql
1.
2.
3.
4.
5.
6.
SELECT a.id, b.title AS title1, c.title AS title2
FROM categories a
INNER JOIN translates b
ON a.id = b.category_id AND b.language_id = 0
LEFT JOIN translates c
ON a.id = c.category_id AND c.language_id = 1
...
Рейтинг: 0 / 0
28.03.2015, 12:01:16
    #38919752
retvizan
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос на перевод категорий
NMFES retvizan
Что-то у вас первая таблица вообще никак не фигурирует в запросе.
Вы сами писали:
NMFESНа выводе получить следующее (допустим, надо получить на английском, но если нет перевода то на русском):
1 | First category
2 | Вторая категория

Одним запросом возможно выбрать?
А для такого результата первая таблицы не нужна. Если она все-таки вам нужна, то добавьте её.
...
Рейтинг: 0 / 0
28.03.2015, 12:06:05
    #38919755
UNION ALL,
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос на перевод категорий
NMFES UNION ALL,,

Для перфекциониста это даже очень и очень аргумент)
2 селекта и 3 джоина на такую, казалось бы, простую операцию.

При выводе чтоли отрезать лишнее через php, а запросом тянуть перевод на обеих языках. Надо подумать.

Код: sql
1.
2.
3.
4.
5.
6.
SELECT a.id, b.title AS title1, c.title AS title2
FROM categories a
INNER JOIN translates b
ON a.id = b.category_id AND b.language_id = 0
LEFT JOIN translates c
ON a.id = c.category_id AND c.language_id = 1


аа, так вот это ж и есть самый простой вариант
Код: sql
1.
2.
3.
4.
5.
6.
SELECT a.id, ifnull(c.title,b.title) AS title,  ifnull(c.language_id,b.language_id) as language_id
FROM categories a
INNER JOIN translates b
ON a.id = b.category_id AND b.language_id = 0
LEFT JOIN translates c
ON a.id = c.category_id AND c.language_id = 1
...
Рейтинг: 0 / 0
28.03.2015, 12:10:48
    #38919757
NMFES
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос на перевод категорий
UNION ALL,[/src]
аа, так вот это ж и есть самый простой вариант
Код: sql
1.
2.
3.
4.
5.
6.
SELECT a.id, ifnull(c.title,b.title) AS title,  ifnull(c.language_id,b.language_id) as language_id
FROM categories a
INNER JOIN translates b
ON a.id = b.category_id AND b.language_id = 0
LEFT JOIN translates c
ON a.id = c.category_id AND c.language_id = 1

[/quot]

Во-во. Я же чувствую, что тут можно по-проще :D
Спасибо.
...
Рейтинг: 0 / 0
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Запрос на перевод категорий / 12 сообщений из 12, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]