MySQL SELECT DISTINCT кілька стовпців


78

Скажімо, у мене є стовпці a, b c, dв таблиці в базі даних MySQL. Що я намагаюся зробити, це вибрати різні значення ВСІХ цих 4 стовпців у моїй таблиці (лише різні значення). Я пробував такі речі, як:

SELECT DISTINCT a,b,c,d FROM my_table;
SELECT DISTINCT a,b,c,d FROM my_table GROUP BY a,b,c,d;

Жоден з тих не працював. Хтось може тут допомогти?

Дякую

ПРИМІТКА Я хочу окремі значення стовпців a, b, c dокремо. Не чітке поєднання значень


якщо в ньому є якийсь унікальний стовпець, це не буде працювати. distinct не працює на унікальній колонці.
Хаммад-хан,

Жодна зі стовпців не є унікальною
765368

тоді ви отримуєте правильний результат, якщо ви не використовуєте приєднання
Хаммад Хан,

2
Вам слід пояснити, що ви маєте на увазі під "різними значеннями ВСІХ цих 4 стовпців", оскільки це повинно означати для вас щось інше, ніж це зазвичай означає, що ці запити не повертають того, що ви хочете. Зразкові дані та вихідні дані були б стислим способом передати це.
Ден Гроссман

2
Я хочу мати різні значення a, b, c та d, а не комбінацію значень
user765368

Відповіді:


51

це може допомогти?

select 
(SELECT group_concat(DISTINCT a) FROM my_table) as a,
(SELECT group_concat(DISTINCT b) FROM my_table) as b,
(SELECT group_concat(DISTINCT c) FROM my_table) as c,
(SELECT group_concat(DISTINCT d) FROM my_table) as d

8
Що робити, якщо мені потрібні лише різні результати з перших двох стовпців, але мені потрібно показати всі стовпці ...
Uday Hiwarale

2
ncastro's краще. Прохолодніше, легше, у будь-якому випадку.
Буффало

Гей Несім, дякую! до речі, якщо "my_table" - це цілий запит, як я можу назвати його по імені та згадувати знову і знову
Томер

Але цей результат дає значення, розділене комами. Як я можу позбутися цих проблем.
Chayan Biswas

Чаян, це різні питання, але цеREPLACE(group_concat(DISTINCT d),',',' ')
Slam

77

Я знаю, що питання все одно застаріле:

select a, b from mytable group by a, b

дасть ваші всі комбінації.


2
Якийсь крутий. "Групування" змушує чіткість. Це те, що відбувається?
Джибран

Не могли б Ви, детальніше, розробити запит?
Хорхе Лавін,

9
@ncastro Вибачення, але ця відповідь не задовольняє питання.
Жадання знань

Це повільно для великих столів.
Джон Т

20

Вгадуючи результати, які ви хочете, можливо, це саме той запит, який ви тоді хочете

SELECT DISTINCT a FROM my_table
UNION 
SELECT DISTINCT b FROM my_table
UNION
SELECT DISTINCT c FROM my_table
UNION
SELECT DISTINCT d FROM my_table

1
Це теж працює, але мені більше подобається поділ між результатами у відповіді Несіма Разона. Дякую
765368

Класно - я збирався розглянути їх поєднання
Адріан Корніш

4
Якщо ви хочете отримати значення DISTINCT у всіх стовпцях, вам доведеться обернути цей запит в інший оператор SELECT, подібний до цього:SELECT DISTINCT value FROM ( SELECT DISTINCT a AS value FROM my_table UNION SELECT DISTINCT b AS value FROM my_table UNION SELECT DISTINCT c AS value FROM my_table ) AS derived
Т. Брайан Джонс

SELECT e,f FROM ( SELECT DISTINCT zdjh AS e FROM tj_xhqd` UNION SELECT DISTINCT sjsj AS f FROM tj_xhqdUNION SELECT DISTINCT xhqd AS g FROM tj_xhqd) a` дає меніError Code: 1054 Unknown column 'f' in 'field list'
Moeez

18

Ще один простий спосіб зробити це за допомогою concat()

SELECT DISTINCT(CONCAT(a,b)) AS cc FROM my_table GROUP BY (cc);

Вибачте, але я не можу знайти жодного еквівалента в базі даних Дербі.
Пранджал Холадхара

Це розумно, і це саме те, що мені потрібно
xtian

Це те, що мені вдалося. Я не знав, як використовувати інші відповіді з кількома об’єднаннями, які я маю у запиті
murume

Недійсна назва стовпця "копія".
Паддимак

Дуже повільний для великих столів.
John T

9

Обидва ваші запити правильні і повинні дати правильну відповідь.

Я б запропонував наступний запит для усунення вашої проблеми.

SELECT DISTINCT a,b,c,d,count(*) Count FROM my_table GROUP BY a,b,c,d
order by count(*) desc

Тобто поле додати кол (*). Це дасть вам уявлення про те, скільки рядків було вилучено за допомогою команди group.


Я хочу чіткі значення a, b, c та d, не чітке поєднання значень
user765368

@hmd: Дякую за це рішення. Саме те, що мені було потрібно. Чи є спосіб включити whereумову? Я хотів лише рядки, де кількість перевищувала 1. Спробував, select distinct a,b,c,count(*) from MyTempTable group by a,b,c order by count(*) desc where count(*)>1;але це не спрацювало.
Нав

@ Nav42 потрібно використовувати having count(*) > 1не, whereоскільки це сукупний запит. До речі, моя відповідь точно не стосується питання ОП, як він викладений вище. У будь-якому разі рада допомогти.
Хаммад Хан

Працює. Дуже дякую. selectdistinct a,b,c,count(*) from MyTable group by a,b,c having count(*) > 1 order by count(*) desc
Nav

9

Це дасть значення DISTINCT у всіх стовпцях:

SELECT DISTINCT value
FROM (
    SELECT DISTINCT a AS value FROM my_table
    UNION SELECT DISTINCT b AS value FROM my_table
    UNION SELECT DISTINCT c AS value FROM my_table
) AS derived

Гарний приклад, який легко вирішив мою проблему. Дякую.
delliottg

Це дасть мені значення в одному стовпці, що якщо я хочу показати їх окремо?
Моез,
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.