有没有办法构建这样的查询?
表一个有10个值,表两个有100个值。
表一个:
id | name | value | weekStart | weekEnd | superValue
-----+--------+-------+------------+-------------+-----------
1 | tom | 1 | 2016-01-01 | 2016-01-07 | A
2 | tom | 1 | 2016-08-01 | 2016-01-14 | E
3 | mark | 0 | 2016-01-01 | 2016-01-07 | A
表两个:
id | name | age
-----+--------+----
1 | tom | 16
2 | Xavier | 19
3 | mark | 20
4 | bob | 20
5 | alan | 35
我根据他们的名字加入了他们(一个记录到多个记录),然后按名称对它们进行分组。
所以我们有一个这样的转发:
id | name | value | (min)weekStart | (max)weekEnd
-----+--------+-------+----------------+-------------
1 | tom | 1 | 2016-01-01 | 2016-01-14
2 | mark | 0 | 2016-01-01 | 2016-01-07
如果此名称的任何值的值为“E”,那么有没有办法显示带有基于第一个表列(superValue)的值的其他列,然后是“是”否则“否”
id | name | value | (min)weekStart | (max)weekEnd | is it super ?
-----+--------+-------+----------------+--------------+---------------
1 | tom | 1 | 2016-01-01 | 2016-01-14 | Yes
2 | mark | 0 | 2016-01-01 | 2016-01-07 | No
答案 0 :(得分:1)
我没有得到,你是如何处理one.value的,但这是我的解决方案: (所以你实际上不需要子查询。)
select
`two`.`id`,
`two`.`name`,
max(`one`.`value`) as `value`,
min(`one`.`weekStart`) as `minWeekStart`,
max(`one`.`weekEnd`) as `maxWeekEnd`,
sum(if(`one`.`superValue` = 'E', 1, 0)) > 0 as `is it super?`
from
`two`
inner join `one`
on (`two`.`name` = `one`.`name`)
group by
`two`.`name`
order by
`two`.`id`;
如果您通过ID引用表two
,而不是名称,则会更好。
编辑:解释它的工作原理:
sum(if(`one`.`superValue` = 'E', 1, 0)) > 0 as `is it super?`
" if" sum里面的语句返回1的值是' E'否则返回0。总和只是将这些0和1加在一起,最后我们检查总和是否大于0,这意味着:是否至少有一个' E' E' E'值。
答案 1 :(得分:0)
是的,这是可能的。只需使用select
向case
添加其他列即可。如果在内部联接或表1的实际名称中给出,则将table-one替换为table-one的别名。
select <existing-columns>,Case when Max(table-one.superValue) = 'E' then 'yes' else 'no' end as [is-it-super]
from <existing-joins>