Задавайте вопросы, мы ответим
Вы не зашли.
Есть таблица
Неактивен
Неактивен
Неактивен
Скобку потерял, нужно
SUBSTR(min(CONCAT(`r`,`language`)),2)
Неактивен
Неактивен
if(`language`='ru',1,if(`language`='en',2,3))
вот что значит ночью писать
Неактивен
Неактивен
if( `language` = 'ru', 1, if( `language` = 'en', 2, 3 ) ) r
создает доп колонку по имени `r`, в которой находится 1 если язык русский, 2 если английский и 3 во всех остальных случаях.
(SELECT `profession_id` , `language` , if( `language` = 'ru', 1, if( `language` = 'en', 2, 3 ) ) r
FROM `tech_professions_names`
WHERE `tech_professions_names`.`profession_id`
IN ( 1, 2, 3, 4 )
)t
Образует временную таблицу `t`, в которой содержится id профессии, язык и доп поле r.
Осталось только сгруппировать эту таблицу по id профессии. Но выбирать поля, не входящие в группировку, без группирующей функции нельзя. Т.е. если мы напишем
SELECT `profession_id` , `language` , min(r) ... GROUP BY `profession_id`
то значение `language` будет произвольное, а не соответствующее min(r).
Поэтому объединяем число со строкой CONCAT( `r` , `language` ), выбираем минимальное значение, а затем отрезаем первый символ, который является значением поля `r` и получаем на выходе нужный `language`.
Неактивен
я правильно поняла, что вот тут добавляя вложения, можно увеличить количество языков?
Неактивен
Я настолько была рада результату, что проморгала исчезновение третьего столбца. Сейчас добавила его, и остолбенела, имена из разных строчек смешаны. Язык указан один, а слово выдаётся на совсем другом
Неактивен
animegirl написал:
я правильно поняла, что вот тут добавляя вложения, можно увеличить количество языков?
if( `language` = 'ru', 1, if( `language` = 'en', 2, 3 ) ) r
if( `language` = 'ru', 1, if( `language` = 'en', 2, if( `language` = 'de', 3, 4 ) ) ) r
?
Да.
Неактивен
animegirl написал:
Я настолько была рада результату, что проморгала исчезновение третьего столбца. Сейчас добавила его, и остолбенела, имена из разных строчек смешаны. Язык указан один, а слово выдаётся на совсем другом
SELECT `profession_id` , SUBSTR( min( CONCAT( `r` , `language` ) ) , 2 ) `language` , `profession_name`
FROM (
SELECT `profession_id` , `language` , `profession_name` , if( `language` = 'ru', 1, if( `language` = 'en', 2, 3 ) ) r
FROM `tech_professions_names`
WHERE `tech_professions_names`.`profession_id`
IN ( 1, 2, 3, 4 )
)t
GROUP BY `profession_id`
О чем я и писал выше - нельзя при группировке выбирать поле без группирующей функции.
SELECT `profession_id` , SUBSTR( min( CONCAT( `r` , `language` ) ) , 2 ) `language` , SUBSTR( min( CONCAT( `r` , `profession_name` ) ) , 2 ) `profession_name` ....
Неактивен
Неактивен
Да, действительно, такое может быть. Тогда выбирайте этим запросом только `profession_id` и `language`. А `profession_name` вторым запросом или через join.
Неактивен
В каком плане вторым запросом? Мне же нужно, чтоб оно соответствовало друг другу O_o
Неактивен
Комбинация (`profession_id`,`language`) однозначно характеризует строку.Поэтому и `profession_name` будет соответствующим.
Неактивен
Аааааа, супер, работает как надо, теперь засела разбираться как функционирует.
Спасябки!
Неактивен
Правила тут чуток запрос, чтоб потом если, что понят, о чём речь, и параллельно усваивала, ново вы ученное. Да вот задумалась над самым начальным запросом, а там нужно вообще выбирать вот эти вещи?
SELECT `profession_id`,`profession_language`,`profession_name`,IF(`profession_language`='ru',1,IF(`profession_language`='en',2,3)) `language_priority`
?
Неактивен
Нет, не нужно (это осталось не убранным из предыдущей редакции запроса).
Неактивен
Я вот над чем задумалась, мы в самом начале процесса делаем выборку по ИД, а в конце джойним целую таблицу. А можно джойнить только первую выборку? И увеличит ли это скорость?
Неактивен
Можно, но ухудшит.
Во-первых, сейчас мы в вначале выбираем только (`profession_id`,`language`), которые являются уникальным ключом, т.е. обращение к данным не происходит (вся необходимая информация содержится в индексе). А в предлагаемом вами варианте придется сразу выбирать (`profession_id`,`language`,`profession_name`).
Второе, объединяя таблицу с первой выборкой используется индекс (первая выборка это временная таблица и данные из неё по ключу ищутся в основной таблице). Т.е. операция быстрая. А если объединять выборку с самой собой, то будет перебор (так как временная таблица индекса не содержит).
Неактивен
vasya написал:
Можно, но ухудшит.
А если объединять выборку с самой собой, то будет перебор (так как временная таблица индекса не содержит).
С одной стороны я вас поняла, с другой стороны посмотрим так.
Таблица на 100М записей. Передано 100 ИД, получено ~500 записей (до группировки).
И того у нас есть два варианта для джойна, таблица в 100М на диске но с индексами, либо таблица на 500 записей в RAM но без индексов.
Неактивен