всем привет.
Вопрос -есть 3 таблицы юзеры, группы юзеров и промежуточная для связки юзеры-группы
поля таблицы юзеры id name
поля таблицы группы id name
поля промежуточной таблицы id_user id_group
суть вопроса
как правильно составить запрос так что бы в выдаче вылезли все юзеры, но с начала те, которые принадлежат к определенной группе, а далее все те кто к ней не относится
смотрел Join но что- то не то
т.е. на руках должна получится выборка по айдишнику группы, так что бы сначала шли добавленные юзеры, а потом не добавленные
DedMorozzz
16.10.2013 - 19:10
А что именно с джоином не то?
_____________
Если не говорить пользователям, что Linux это "Сложно и страшно", то им совершенно всё равно, в чём не разбираться
пока додумался до такой реализации, но она кажется громоздкой
SELECT AC.id AS id, AC.name AS name
FROM `user` AS AC
LEFT JOIN `group` AS PART ON (AC.id = PART.id_usert OR AC.id != PART.id_usert)
WHERE 1 =1 GROUP BY AC.id
ORDER BY PART.group DESC
DedMorozzz
16.10.2013 - 19:18
не вдаваясь в подробности по каким критериям происходит связь - всё нормально
Но таблицы на выходе получишь не 3, а 2. Ибо джоин тока 1
И громоздкости не вижу, всё норм
Посмотрел...
Цитата |
(AC.id = PART.id_usert OR AC.id != PART.id_usert) |
Что это?
Это же взаимоисключающие условия
_____________
Если не говорить пользователям, что Linux это "Сложно и страшно", то им совершенно всё равно, в чём не разбираться
т.е. в запросе все в порядке? не смущает условие в джоине (AC.id = PART.id_usert OR AC.id != PART.id_usert)
DedMorozzz
16.10.2013 - 19:20
я же дописал после
Отредактировал свой пост
Кинь структуру таблиц - покажу запрос
_____________
Если не говорить пользователям, что Linux это "Сложно и страшно", то им совершенно всё равно, в чём не разбираться
поля таблицы юзеры id name
поля таблицы группы id name
поля промежуточной таблицы id_user id_group
DedMorozzz
16.10.2013 - 19:27
даже лучше так, под себя сам переделаешь
Таблицы 3 users, types, user_types
SELECT * FROM user_types
LEFT JOIN users ON user_types.user_id=users.id
LEFT JOIN types ON user_types.type_id=types.id
ORDER BY types.id = 12 DESC
_____________
Если не говорить пользователям, что Linux это "Сложно и страшно", то им совершенно всё равно, в чём не разбираться
наверно не верно объяснил
в сущности должно получится то же самое, если бы сначала были выбраны юзеры одной группы
а следующей выборкой все юезеры вне этой группы и выборки объединены
Т.е. таблица группа не нужна, для запроса нужны я полагаю 2 таблицы юзеры и таблица соотношения
DedMorozzz
16.10.2013 - 19:45
Грамотно заданный вопрос - залог успеха
И на данный момент он не такой. И изначально не такой. Если 2 выборки - зачем их после в 1 объеденять, лучше сразу 1 выборку сделать.
Если не нужна таблица групп - тогда так:
SELECT * FROM user_types
LEFT JOIN users ON user_types.user_id=users.id
ORDER BY user_types.type_id = 12 DESC
Где 12 - произвольное число. Подставь туда нужное
_____________
Если не говорить пользователям, что Linux это "Сложно и страшно", то им совершенно всё равно, в чём не разбираться
SELECT * FROM user_types
LEFT JOIN users ON user_types.user_id=users.id
ORDER BY user_types.type_id = 12 DESC
да но эта выборка создаст первую половину те коорые относятся к группе, а как в эту выборку после относящихся добавить те что не относятся к указанной группе?
DedMorozzz
16.10.2013 - 19:53
Да ненадо ничего добавлять, там после юзеров относящихся к группе с номером 12 - будут все остальные
ORDER - это не условие выборки, это сортировка
_____________
Если не говорить пользователям, что Linux это "Сложно и страшно", то им совершенно всё равно, в чём не разбираться
да круто спасибо, но на всякий случай скажу, что пришлось использовать GROUP BY user.id для отсева повторений это правильно?
не знал о такой конструкции ORDER BY user_types.type_id = 12
DedMorozzz
А есть ли возможность включить выборку значение on/off т.е допустим добавить поле user_types.group_id и если оно не равно null заменять его значение на 'on'
Быстрый ответ:
Powered by dgreen
Здесь расположена полная версия этой страницы.