我有4个表:一个有事件,一个有事件'服务员,另外两个包含有关这些服务员的信息,可能是单个人或一组人。数据库的设计似乎很公平,对吗?
然后我需要知道谁将参加某个特定活动的名称。然后,我将使用常规联接获取活动的服务员的类型,以及 id 。但我还需要服务员的名称,并根据服务员的类型存储在两个不同的表中。
看看我做了什么:
SELECT
ep.type_attendant 'type',
ep.id_attendant 'id',
IF( ep.type_attendant = 'user', CONCAT( u.firstname, ' ', u.lastname ), g.name ) 'fullname'
FROM
events_attendants ep,
events e,
users u,
groups g
WHERE
ep.id_event = e.id AND
ep.id_attendant = IF( ep.type_attendant = 'user', u.id, g.id )
虽然有效,但并不完美,因为它会为表组返回重复的行。 我想最终得到的是:(除了下面的那个不起作用)
SELECT
ep.type_attendant 'type',
ep.id_attendant 'id',
IF( ep.type_attendant = 'user', CONCAT( u.firstname, ' ', u.lastname ), g.name ) 'fullname'
FROM
events_attendants ep,
events e,
IF( ep.type_attendant = 'user', users u, groups g ) -- variable table
WHERE
ep.id_event = e.id AND
ep.id_attendant = IF( ep.type_attendant = 'user', u.id, g.id )
我也可以运行两个查询,并将结果与PHP合并,但我是那种喜欢学习的人。
MySQL数据库btw。谢谢你的帮助!
答案 0 :(得分:1)
SELECT
ep.type_attendant AS `type`,
ep.id_attendant AS id,
CONCAT( u.firstname, ' ', u.lastname ) AS fullname
FROM
events_attendants ep
JOIN
events e ON ep.id_event = e.id
JOIN
users u ON ep.id_attendant = u.id
WHERE
ep.type_attendant = 'user'
UNION ALL
SELECT
ep.type_attendant,
ep.id_attendant,
g.name
FROM
events_attendants ep
JOIN
events e ON ep.id_event = e.id
JOIN
groups g ON ep.id_attendant = g.id
WHERE
ep.type_attendant <> 'user'