考虑以下示例表:
用户:
id_用户 | 名字 |
---|---|
1 | 保罗 |
2 | 卡罗琳 |
旅行:
id_旅行 | id_用户 |
---|---|
1 | 1 |
2 | 1 |
3 | 2 |
旅行天数:
id_tdays | id_旅行 | 当天有活动 |
---|---|---|
1 | 1 | 不 |
2 | 1 | 不 |
3 | 1 | 是的 |
4 | 2 | 不 |
5 | 2 | 不 |
6 | 3 | 不 |
7 | 3 | 是的 |
8 | 4 | 是的 |
如果我执行以下查询:
SELECT
t.id_travel,
u.name,
td.day_has_activities
FROM travel t
left join users u on u.id_user = t.id_user
left join travel_days td on td.id_travel = t.id_travel
由于第一趟旅程有三天,而第二趟旅程和第三趟旅程各有两天,结果将是这样的:
id_旅行 | id_用户 | 当天有活动 |
---|---|---|
1 | 保罗 | 不 |
1 | 保罗 | 不 |
1 | 保罗 | 是的 |
2 | 保罗 | 不 |
2 | 保罗 | 不 |
3 | 卡罗琳 | 不 |
3 | 卡罗琳 | 是的 |
我需要有唯一的行程行,所以我考虑使用 DISTINC,但 has_activities 字段随机显示“是”或“否”。
我需要知道每次旅行是否包含有活动的日子,所以完美的结果是这样的:
id_旅行 | id_用户 | 旅行有活动 |
---|---|---|
1 | 保罗 | 是的 |
2 | 保罗 | 不 |
3 | 卡罗琳 | 是的 |
我尝试了类似的方法,但它没有运行:
SELECT
t.id_travel,
u.name,
if ((select count(td.day_has_activities) from t where td.day_has_activities like 'yes') > 0, 'yes', 'no') as travel_has_activities
FROM travel t
left join users u on u.id_user = t.id_user
left join travel_days td on td.id_travel = t.id_travel
您需要通过 id_travel 获取最大 day_has_activities,然后使用
LEFT JOIN
加入您的表:
select t.id_travel, u.name, td.day_has_activities as travel_has_activities
from travel t
left join users u on u.id_user = t.id_user
left join (
select id_travel, max(day_has_activities) as day_has_activities
from travel_days
group by id_travel
) td on td.id_travel = t.id_travel