Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > MySQL > Нужен LEFT JOIN без данных


Автор: maxipub 15.3.2019, 14:31
Добрый день!

Код
SELECT c.cat_id, t.cat_text, t.cat_gender 
FROM cat AS c 
LEFT JOIN cat_text AS t ON t.cat_id=c.cat_id 
WHERE c.cat_id=123;


t.cat_gender ENUM('unisex', 'man', 'woman');
(t.cat_id, t.cat_gender) UNIQUE

Запрос возвращает 1 строку если cat_text не джойнится по условию, и до 3 строк - когда есть что джойнить.

Мне надо сделать так, чтоб запрос всегда возвращал 3 строки и cat_gender был указан:
123 text_OR_NULL 'unisex'
123 text_OR_NULL 'man'
123 text_OR_NULL 'woman'

В общем, чтоб запрос вел себя так, будто к нему INNER JOIN-интся таблица с одним единственным полем cat_gender и тремя записями в нем: 'unisex', 'man', 'woman'. Но без этой таблицы (зачем нам лишние таблицы, если есть вариант без них).

Так можно?

Автор: ksnk 15.3.2019, 16:17
Без временной таблицы - не знаю как сделать
https://www.db-fiddle.com/f/xteXTe18SVzgJjQz7u47wo/1

Автор: maxipub 15.3.2019, 16:44
Жаль... Так понимаю, Вы имели ввиду так:
https://www.db-fiddle.com/f/xteXTe18SVzgJjQz7u47wo/2
(INNER вместо LEFT и tmp.cat_gender вместо t.cat_gender)

Помню делал что-то вида SELECT t.field, 123 AS val... - когда надо было подставить конкретные данные в выборку. Думал, может и с таблицами как-то так можно.

Автор: ksnk 15.3.2019, 23:10
Ну да. Хотя можно и без временной таблицы. SQL велик и в некоторых местах - могуч.... Правда накой такое чудо нужно? smile 
https://www.db-fiddle.com/f/xteXTe18SVzgJjQz7u47wo/5

Автор: Akina 18.3.2019, 08:38
Цитата(maxipub @  15.3.2019,  15:31 Найти цитируемый пост)
Но без этой таблицы (зачем нам лишние таблицы, если есть вариант без них).

Бред. Сервер не может вернуть данные, которых у него НЕТ.

Если это - реальная задача, то в cat_text присутствуют все варианты его значения, и вместо формирования опорной таблицы на основе знания, какие есть варианты для ENUM, надо использовать 
Код

SELECT DISTINCT cat_gender FROM cat_text

Цитата(ksnk @  16.3.2019,  00:10 Найти цитируемый пост)
Правда накой такое чудо нужно?

Формирование опорной таблицы на основании известного набора значений или на основании имеющихся границ - совершенно обычное дело. В рамках MySQL старых (5+) версий да, это приходилось делать извратным образом (вплоть до использования переменных), а в 8+ уже есть честные CTE.

Автор: ksnk 18.3.2019, 12:55
Цитата(Akina @  18.3.2019,  08:38 Найти цитируемый пост)
Если это - реальная задача, то в cat_text присутствуют все варианты его значения, и вместо формирования опорной таблицы на основе знания, какие есть варианты для ENUM, надо использовать 

SELECT DISTINCT ...

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

Ну а самое главное возражение против "давайте все сделаем одним запросом" - это то, что этап выковыривания данных из базы накладывается на  этап оформления формы ввода данных. по идее - это 2 разных действия и не нужно их смешивать в одном запросе... Хотя это чистая лирика, если неизвестно накой все это делается....


Цитата(Akina @  18.3.2019,  08:38 Найти цитируемый пост)
 а в 8+ уже есть честные CTE.

Вообще-то СТЕ не поможет избавится от 3-х селектов с юнитами, а просто вынесет их в более очевидное место smile 

Автор: maxipub 18.3.2019, 14:24
Цитата(ksnk @  15.3.2019,  23:10 Найти цитируемый пост)
https://www.db-fiddle.com/f/xteXTe18SVzgJjQz7u47wo/5

Мне подходит. На таком варианте и остановился. Спасибо!

Есть 2 пола и унисекс. В ближайшем будущем вряд ли появится что-то еще. smile 

Цитата(Akina @  18.3.2019,  08:38 Найти цитируемый пост)
SELECT DISTINCT cat_gender FROM cat_text

Хороший вариант в копилочку. Но не в моем случае, т.к. таблица может быть пустой.

Автор: Akina 18.3.2019, 14:59
Цитата(maxipub @  18.3.2019,  15:24 Найти цитируемый пост)
Есть 2 пола и унисекс. В ближайшем будущем вряд ли появится что-то еще.

А как же none-sex?

Автор: maxipub 19.3.2019, 11:39
Цитата(Akina @  18.3.2019,  14:59 Найти цитируемый пост)
А как же none-sex?

Не знаю что это такое. Типа пол не указан? Интернет-магазин одежды. Выбирается 1 из 3 вариантов.

Автор: Akina 19.3.2019, 15:38
Цитата(maxipub @  19.3.2019,  12:39 Найти цитируемый пост)
Не знаю что это такое. Типа пол не указан?

Ну по смыслу - это то, что не подходит ни мужчинам, ни женщинам...  smile  скажем, ботинки фирмы "Скороход", ежели кто помнит...

Автор: maxipub 15.4.2019, 12:25
Akina, это идет как unisex.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)