2013-09-05 2 views
0
SELECT pc. * , ssc. * , IF(ssc.category_id = pc.ID, '1', '0') AS checked 
FROM property_categories pc 
LEFT JOIN su_selected_categories ssc ON ssc.su_property_settings_id = 9 

Я пытаюсь выполнить запрос на выборку, который находит все категории, а затем видит ли в другой таблице одна из категорий, если это пометить его как «проверено»Возвращающиеся повторяющиеся строки MySQL один ко многим

В этом случае мне нужно оставить 3 строки (3 категории), из которых 2 должны находиться в пределах отмеченного столбца как «1», а остальные - «0».

Этот запрос возвращает повторяющиеся строки, и когда я пытаюсь сгруппировать по pc.ID, он пропускает одну из правильных строк.

Куда я иду не так?

---------------------- 
| id | category_name | 
---------------------- 
| 1 | category1  | 
---------------------- 
| 2 | category2  | 
---------------------- 
| 3 | category3  | 
---------------------- 


--------------------------------------------- 
| id | su_property_settings_id | category_id | 
--------------------------------------------- 
| 1 |      1 |   2 | 
---------------------------------------------- 
| 2 |      9 |   2 | 
---------------------------------------------- 
| 3 |      9 |   1 | 
---------------------------------------------- 
...more 

Обновлено *

Что я получаю с группой по pc.ID

ID | category_name | ID | su_property_settings_id | category_id | checked 
-------------------------------------------------------------------------- 
1 | cat1  | 11 |      9 |   2 |  0 
2 | cat2  | 11 |      9 |   2 |  1 
3 | cat3  | 11 |      9 |   2 |  0 

То, что я хочу

ID | category_name | ID | su_property_settings_id | category_id | checked 
-------------------------------------------------------------------------- 
1 | cat1  | 11 |      9 |   2 |  1 
2 | cat2  | 11 |      9 |   2 |  1 
3 | cat3  | 11 |      9 |   2 |  0 
+0

добавить на 'GROUP BY' в зависимости от того поля (ы) вы хотите не быть«пропустили». В каком поле это не ясно из вашего вопроса, показывая вывод, который вы получаете, и желаемый результат поможет. –

ответ

0

Вы получаете повторяющиеся строки, потому что ваш присоединиться находится на неправильных столбцах. Вы не включаете условие на category_id. Далее следует решить проблему дублирования:

SELECT pc.*, ssc.*, (ssc.category_id is not null) AS checked 
FROM property_categories pc LEFT JOIN 
    su_selected_categories ssc 
    ON ssc.su_property_settings_id = 9 and 
     ssc.category_id = pc.ID; 

Если у вас есть дубликаты (в чем я сомневаюсь), то это, вероятно, связано с дубликатами в category_id колонке.

Это возвращает 1 или 0, в зависимости от категории, является ли каждый выбранный, а не '1' и '0'. Обратите внимание, что это отличается от значений символов в вашем запросе. Я подозреваю, что числовое значение более уместно.

Если вы хотите, чтобы значения символов, а затем изменить SELECT на:

SELECT pc.*, ssc.*, 
     (case when ssc.category_id is not null then '1' else '0' end) AS checked 
+0

Большое спасибо! Да, мне нужны числовые значения - я не уверен, почему я их завернул в кавычки. –

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