我正在从两个表格中选择一些项目 - table1
,table2
:
table1
id (primary) | user_id | group_id | name | description | active_from | active_to
和
table2
id (primary) | user_id | group_id | name | description | active_from
这些表中的每个项目都属于某个组。我用于显示项目的代码如下:
SELECT 'table1' AS table_name, id, user_id, group_id, name, description, active_from, active_to
FROM table1 WHERE user_id='".$user_id."'
UNION ALL
SELECT 'table2' AS table_name, id, user_id, group_id, name, description, active_from, null
FROM table2 WHERE user_id='".$user_id."'
ORDER BY group_id, name ASC
上面的代码为我提供了按{_ 1}}和table1
分组的项目列表,这些项目按group_id分组(然后按名称分组)。组列表包含在表table2
中。表groups
的结构:
groups
但是,有些群组不包含group_id (primary) | user_id | group_name
或table1
中的内容。我尝试添加到当前结果的是那些空组(以与项目相同的方式列出)并基于group_name对结果进行排序。
我尝试使用以下代码,这会引发“您的SQL语法中出现错误”:
table2
如何将空组添加到项目列表中(仅显示group_id和空行)?
如何显示group_name而不是group_id(并按group_name而不是group_id对结果进行排序)?
答案 0 :(得分:-1)
您需要使用正确的括号分隔union all
以获得更好的可见性。现在最后一个联合的条件都不正确,你可能需要left join
或not exists
(
SELECT
'table1' AS table_name,
id,
user_id,
group_id,
name,
description,
active_from,
active_to
FROM table1
WHERE user_id='".$user_id."'
)
UNION ALL
(
SELECT
'table2' AS table_name,
id,
user_id,
group_id,
name,
description,
active_from,
null
FROM table2
WHERE user_id='".$user_id."'
ORDER BY group_id, name ASC
)
UNION ALL
(
SELECT
'groups_empty' as table_name,
null,
null,
group_id,
null,
null,
null,
null
FROM groups
WHERE user_id='".$user_id."'
AND
not exists(
select 1 from table2 where table2.group_id = groups.group_id
)
)