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

我正在尝试执行查找所有类别的选择查询,然后查看其中一个类别是否在另一个表中,如果将其标记为“已检查”

在这种情况下,我需要留下 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 
4

1 回答 1

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列中存在重复项。

这将返回1or 0,具体取决于是否每个都选择了该类别,而不是'1'and '0'。请注意,这与查询中的字符值不同。我怀疑数值更合适。

如果您想要字符值,请将其更改SELECT为:

SELECT pc.*, ssc.*,
       (case when ssc.category_id is not null then '1' else '0' end) AS checked
于 2013-09-05T21:59:24.930 回答