2016-11-25 4 views
1

У меня есть таблица со следующей структурой:Объединение нескольких различных значений

| animal | color | 
|--------|-------| 
| dog | black | 
| dog | white | 
| cat | white | 
| dog | black | 
| mouse | grey | 

Теперь я хочу, чтобы получить различные значения каждого столбца.

Просто делать:

SELECT DISTINCT animal, color from tab1 

бы просто пропустить 2-ое появление dog - black:

| animal | color | 
|--------|-------| 
| dog | black | 
| dog | white | 
| cat | white | 
| mouse | grey | 

Но то, что я хочу, это некоторая структура, которая выглядит следующим образом:

animal: dog, cat, mouse 
color: black, white, grey 

Мой подход было бы просто выполнить несколько запросов SELECT:

- SELECT DISTINCT animal from tab1 
- SELECT DISTINCT color from tab1 

А затем просто объедините эти результаты в массив с PHP.

Но есть ли более быстрый способ, может быть, с одним запросом?

+3

Прежде всего, почему бы не очистить данные? У вас есть собака, черный повторяется – e4c5

+1

@ e4c5 Я думаю, это то, что беспокоит OP. –

ответ

6

Да, ваш второй подход является правильным, но вы можете сделать это с помощью SQL:

SELECT DISTINCT `animal` from `tab1` UNION SELECT DISTINCT `color` from `tab1` 

Хорошая вещь о UNION, оно уже фильтрует ваши ценности. Таким образом, вы можете избавиться от DISTINCT оставив вас с:

SELECT `animal` from `tab1` UNION SELECT `color` from `tab1` 

Но в этом случае вы не сможете отличить который от цвета и что от животного. Вы можете добавить разделитель SELECT и использовать его для дифференциации.

+2

Спасибо, но не могли бы вы описать, что вы подразумеваете под 'separator SELECT'? Мне действительно нужно различать, какие группы (животные или цвет) принадлежат значениям. – user1170330

+0

@ user1170330 теперь это даст вам весь список цветов и животных, объединенных в один столбец справа, поэтому, чтобы добавить разделитель, добавьте еще один 'UNION' в середине, например' UNION SELECT '-----' ' поэтому он дает вам дифференциацию. Дайте мне знать, если это сработает. ': D' –

+0

Кроме того, проблема или преимущество в вашей текущей ситуации состоит в том, что каждый цвет связан с конкретным животным, поэтому их невозможно разбить, если вы не используете два запроса. ':)' –

-1

Вы смотрите на группу?Например:

SELECT animal from tab1 GROUP BY animal 
+3

Группа будет производить те же самые результаты, что и в этом случае – Auris

+2

Я тоже подумал, что это фильтр. Узнал что-то новое! – Joost

+1

Группа не фильтрует, она просто объединяет строки по одному или нескольким полям – Auris

0

U можно сгруппировать их по две колонки с этим SQL:

SELECT animal, color FROM tab1 GROUP BY animal, color 

EDIT:

Чтобы проверить мое заявление я создал таблицу MySQL с этим SQL:

CREATE TABLE animals (ID int (11) NOT NULL AUTO_INCREMENT,
name VARCHAR (45) По умолчанию значение NULL, color VARCHAR (45) По умолчанию NULL, то
ПЕРВИЧНЫЙ КЛЮЧ (ID)) ДВИГАТЕЛЬ = InnoDB AUTO_INCREMENT = 5 По умолчанию CHARSET = utf8;

Я заселить с этим значением:

1 собака белого

2 собакой черного

3 собакой белым

4 кошка белого

Когда я запускать s SQL: "ВЫБРАТЬ имя, цвет от животных GROUP BY имя, цвет"

Я получил этот результат:

кошка белый

собака черный

собака белый

Если вы хотите получить, у кого есть дубликаты, вы можете запускать SQL так: «SELECT name, color, COUNT (ID) в виде номера FROM animals GROUP BY name, цвет HAVING number> 1», который дает мне этот результат:

собака белый 2

Надежда я помог тебе.

+0

Вы уверены? Посмотрите на комментарий Aurios –

+0

Да, я уверен, это даст тот же результат, что и два столбца, плюс вы можете сделать что-то вроде этого SQL: «SELECT животное, цвет, COUNT (ID) как count_no FROM tab1 GROUP BY animal, color" чтобы подсчитать, сколько случаев в таблице имеют дубликаты. Btw Я всегда проверяю перед публикацией :) – AdrianES

Смежные вопросы