2013-04-18 3 views
0

Как отобразить все поля строки, основанные на 1 поле, отличное (т.е. не должно никаких дубликатов для этой области)Использование Distinct в подзапроса

Предположим, что есть таблица называется Office_Roles с полей и данных, как показано ниже

Name Department Designation 

John Marketing Executive 
John Sales  Executive 
John PR   Executive 

Так я хочу, чтобы конечный результат, чтобы отобразить все поля в строке, но и для всего 1 Иоанна (отчетливым)

Выход как -

John Mark eting (или продажи) (или Pr) Исполнительный

Я думал о чем-то вроде

select * from Office_Roles where name =(select distinct name from Office_Roles); 

Как мы делаем что-то вроде этого правильно? Я также хочу сделать заказ By и Ограничить количество результатов на странице на конечный результат ...

+0

Вы хотите сделать 'JOIN' или использовать' EXISTS'? – Kermit

+0

есть три отдела для пользователя 'Джон', что вы хотите отобразить? –

+0

@FreshPrinceOfSO Я бы использовал левое внешнее соединение в исходном запросе, который, я думаю, не влияет на результат, на что я задаю этот вопрос ... – user481913

ответ

-1

Я просто хотел бы использовать GROUP BY

SELECT * FROM Office_Roles GROUP BY name; 

легко.

+0

Я пробовал это раньше - я где-то читал, что в mysql, когда не использует агрегированные функции в предложении Group By, это похоже на использование Distinct ... Но клиент, над которым я работаю, что-то изменил/добавил больше данных и, возможно, похоже, не работает .. Так что я думал, что лучше использовать верный путь выстрела (Distinct) вместо этого ... – user481913

+0

Эй, помощник .. Я на 100% уверен, что этот запрос работает. А также не имеет значения размер вашей базы данных. Пожалуйста, разместите здесь ошибку и версию вашего сервера mysql, а затем я могу дать вам более точный ответ. – medina

0

Вы не можете иметь переменное количество столбцов для запроса. Одна вещь, которую вы можете сделать, это сцепить значения вместе:

select name, group_concat(Department) as departments, 
     group_concat(Designation) as designations 
from Office_Roles o 
group by name 
+0

как насчет 'group_concat (обозначение DISTINCT)'? ': D' –

+0

@JW. , , На самом деле я не знаю. Это обоснованное предположение о том, что может помочь. –

+0

@GordonLinoff - мне не нужен group_concat() ... Пожалуйста, см. Мои комментарии ниже для ответов dougis и medina ... – user481913

0

Вы собираетесь получить 3 строк в любом случае, так как есть в таблице 3, которые совпадают, строки которой вы пытаетесь исключить и как запрос должен знать, что НЕ показывать?

+0

Ну, не явное предложение в подзапросе возвращает мне только 1 Джона из 3, а затем на основе этого Джона внешний запрос выдает мне остальные поля в строке? – user481913

+0

, тогда вы должны создать поле Id, которое динамически увеличивается при добавлении записей, и вы можете сравнить с id, чтобы получить требуемый результат. –

+0

Нет, подзапрос даст вам 1 Джон, который затем сопоставляет все 3 строки во внешнем запросе. Вы получаете 3 строки независимо. Какие строки вы хотите исключить из набора результатов таблицы. Чтобы проверить замену подзапроса на имя = «Джон» и посмотреть, что вы получаете (это единственный результат), если у вас нет отдельного в подзапросе, вы фактически получите 9 строк по 3 в главном запросе для каждый из 3-х Джонсов в подзапросе. – dougis

0

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

select name, group_concat(Department SEPARATOR ' or ') as departments, 
     Designation 
from Office_Roles a 
group by name,Designation 

Yoy может играть с SQL Fiddle здесь Demo