2016-07-21 2 views
0

Предположим, у меня есть пять столбцов в моей таблице.MySQL Query: Display Specific Column

Колонка 1: Название магазина и колонки 2 до 5: Магазин Типы

Для Название магазина, он будет в основном содержат только название магазинов. Для столбцов 2-5 он будет содержать ДА или НЕТ в зависимости от типа хранилища. Например:

StoreName | Clot. | Food | App. | Shoes 
Mcdonalds | NO | YES | NO | NO 
MC ShoeStore | NO | NO | NO | YES 

Теперь я хочу, чтобы придумать с запросом, в котором я бы отобразить все магазины, начиная с буквой М и их типом магазина без другого типа магазина с «NO» в оказываясь.

Я только знаю:

SELECT NameOfStore from table where NameOfStore LIKE '%m' 

Я не уверен, о том, как я собираюсь показать тип магазина, где она содержит YES. или это возможно?

+1

Может ли магазин имеет более чем один 'да'? Как 'CLOTHING = YES' и' SHOES = YES' для одного магазина? – Nicarus

+0

Очень возможно, что в магазине продаются как обувь, так и одежда. – AndyMarty

+1

OK - Как бы вы хотели представить это в своих результатах? – Nicarus

ответ

0

Вы можете просто использовать оператор case. Кроме того, ваш критерий WHERE был неправильным.

SELECT 
    NameOfStore, 
    CASE 
     WHEN Clothes = 'YES' THEN 'Clothes' 
     WHEN Fastfood = 'YES' THEN 'Fastfood' 
     WHEN Appliances = 'YES' THEN 'Appliances' 
     WHEN Shoes = 'YES' THEN 'Shoes' 
    END AS TypeOfStore 
FROM 
    table 
WHERE 
    LOWER(NameOfStore) LIKE 'm%'; 

Обработка нескольких типов магазинов для одного магазина:

SELECT 
    NameOfStore, 
    CONCAT_WS(' & ', --This is the separator to use - you can replace this with whatever 
    CASE WHEN Clothes = 'YES' THEN 'Clothes' END, 
    CASE WHEN Fastfood = 'YES' THEN 'Fastfood' END, 
    CASE WHEN Appliances = 'YES' THEN 'Appliances' END, 
    CASE WHEN Shoes = 'YES' THEN 'Shoes' END 
    ) AS TypeOfStore 
FROM 
    table 
WHERE 
    LOWER(NameOfStore) LIKE 'm%'; 

Ваш результат будет выглядеть примерно так:

NameOfStore | TypeOfStore 
----------------------------- 
McDonalds  | Fastfood 
Mike's Shop | Clothes & Shoes 
+0

Это сработало. Благодарю. И что делает LOWER? – AndyMarty

+0

'LOWER()' нижний регистр строки. Использование только 'LIKE 'm%'' будет соответствовать только магазинам с нижним регистром «m» в начале имени. Я сделал имя магазина в нижнем регистре, чтобы соответствовать любому магазину с нижним или верхним регистром «m» в начале имени – Nicarus

+0

Oh. Хорошо. Благодаря! – AndyMarty

1

Чтобы быть более гибким, я хотел бы предложить вам первый изменить структуры ваших данных.

Таблица магазин

+--+---------+-------------+ 
|id|name  |store_type_id| 
+--+---------+-------------+ 
| 1|Mcdonalds|   2| 
| 2|Mc Shoes |   4| 

Таблица store_type

+--+-----------+ 
|id|name  | 
+--+-----------+ 
| 1|Clothing | 
| 2|Fastfood | 
| 3|Applicances| 
| 4|Shoes  | 

Тогда вы можете просто присоединиться типы магазинов в магазинах.

SELECT 
    store.name, 
    store_type.name AS store_type 
FROM 
    store 
    LEFT JOIN store_type ON store.store_type_id = store_type.id 

Если магазин может иметь более одного типа вы бы использовать associative table, чтобы связать два вместо store_type_id столбца в таблице магазина.

Таблица store_store_types

+--------+-------------+ 
|store_id|store_type_id| 
+--------+-------------+ 
|  1|   2| 
|  2|   1| 
|  2|   4| 

И запрос ...

SELECT 
    store.name, 
    store_type.name AS store_type 
FROM 
    store 
    LEFT JOIN store_store_type rel ON store.id = rel.store_id 
    LEFT JOIN store_type ON rel.store_type_id = store_type.id