Получение выбранных элементов и ни одного выбранного - PullRequest
1 голос
/ 09 марта 2012

Я хочу узнать, какие элементы выбраны и все, что не выбрано, становится 0

Это полезно для списка (или раскрывающегося списка), все, что выделено, означает, что оно было добавлено (LEFT JOIN)

Я не смог заставить работать SQL:

SELECT StoreID,  ft.id, name, count(1) as Selected 
FROM `store_food_type` AS sft  
    LEFT JOIN food_type AS ft 
        ON ft.id = sft.food_type_id 
WHERE StoreID = 17633
GROUP BY ft.id

UNION

SELECT 0,  ft.id, name, 0 as Selected FROM food_type AS ft

Редактировать: Ошибка не вызвала, он показывает результат, но name дублируются, чего я не хочу.

Это выглядит так:

+------------+------+----------+----------+
| StoreID    | id   | name     | Selected |
+------------+------+----------+----------+
|      17633 |    1 | Indian   |        1 |
|      17633 |    8 | American |        1 |
|          0 |    1 | Indian   |        0 |
|          0 |    2 | English  |        0 |
|          0 |   25 | Kurdish  |        0 |
|          0 |    5 | Chinese  |        0 |
|          0 |    7 | Turkish  |        0 |
|          0 |    8 | American |        0 |
+------------+------+----------+----------+

Я хочу, чтобы результат выглядел так:

+------------+------+----------+----------+
| StoreID    | id   | name     | Selected |
+------------+------+----------+----------+
|      17633 |    1 | Indian   |        1 |
|      17633 |    8 | American |        1 |
|          0 |   25 | Kurdish  |        0 |
|          0 |    5 | Chinese  |        0 |
|          0 |    7 | Turkish  |        0 |
|          0 |    8 | American |        0 |
+------------+------+----------+----------+

Ответы [ 3 ]

1 голос
/ 09 марта 2012

Вероятно, самый простой подход - сгруппировать результаты вашего объединенного запроса - например, так:

SELECT MAX(StoreID) StoreID,  id, MAX(name) name, MAX(Selected) Selected FROM
(SELECT StoreID,  ft.id, name, count(1) as Selected 
 FROM `store_food_type` AS sft  
     LEFT JOIN food_type AS ft 
         ON ft.id = sft.food_type_id 
 WHERE StoreID = 17633
 GROUP BY ft.id
 UNION
 SELECT 0,  ft.id, name, 0 as Selected FROM food_type AS ft) sq
GROUP BY id
1 голос
/ 09 марта 2012

Ваши строки дублируются из-за UNION в вашем запросе. На самом деле весь ваш запрос задом наперед - вы пытаетесь получить список всех типов продуктов питания с указателем, указаны ли они для данного магазина.

Попробуйте вместо этого:

SELECT ft.id, ft.name, COALESCE(sft.storeId, 0) as storeId, 
       CASE WHEN sft.storeId IS NOT NULL THEN '1'
            ELSE '0' END as selected
FROM food_type a ft
LEFT JOIN store_food_type as sft
ON sft.food_type_id = ft.id
AND sft.storeId = 17633

Хотя вам не нужен столбец selected, так как вы можете просто проверить, был ли столбец результата storeId равен 0 или нет.

0 голосов
/ 09 марта 2012

Я не уверен, что этот ответ лучше, чем вариант UNION, предложенный Марком Баннистером, но это еще один способ сделать это.

SELECT sft.storeid, ft.id, ft.name, count(sft.storeid) selected
FROM   store_food_type sft
       FULL JOIN food_type ft ON ft.id = sft.food_type_id
WHERE  sft.storeid = 17633 or sft.storeid is null
GROUP  BY ft.id, ft.name, sft.storeid

Если продукт питания может быть выбран только один раз для любого данного магазина, то поле «выбранное» и GROUP BY являются избыточными.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...