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
答案 0 :(得分: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