涉及子查询的查询

时间:2014-06-14 03:49:56

标签: mysql sql

我有一个存储有关艺术家,乐队和专辑的信息的数据库,我试图为超过1张专辑的乐队选择乐队名称和专辑名称。

band_id, name, year_formed
1, blink182, 1990
2, fall out boy, 1997
3, u2, 1982
4, coldplay, 1990
5, zach brown band, 2002

和专辑

album_id, title, band_id
1, take off your pants and jack it, 1
2, stars, 3
3, fbgm, 3
4, reach, 3
5, yup, 4

这似乎不是一个问题太难,但我无法弄清楚我的生活。 问题似乎是从select语句中获取专辑标题和乐队名称。

SELECT b.name, alb.title
FROM band as b, album as alb
WHERE exists (SELECT * FROM album as al WHERE b.bid = alb.bid)

返回所有乐队名称及其专辑标题。我的猜测是让子查询处理多个专辑的乐队,但我完全不知道如何做到这一点。一般来说,子查询一直在抛弃我的循环,所以对它们如何在概念上工作的任何好的描述都会受到赞赏。

3 个答案:

答案 0 :(得分:0)

我认为你没有使用EXISTS,而是使用JOIN

SELECT b.name, a.title
FROM band b 
    JOIN album a ON b.bid = a.bid

如果您正在寻找具有多个标题的乐队,那么您还需要使用汇总查询:

SELECT b.name, a.title
FROM band b 
    JOIN album a ON b.band_id = a.band_id 
    JOIN (SELECT band_id
          FROM album
          GROUP BY band_id 
          HAVING COUNT(*) > 1) c ON b.band_id = c.band_id

答案 1 :(得分:0)

您可以使用LEFT JOIN

SELECT b.name,x.title  AS Title
FROM band  b LEFT JOIN ( SELECT band_id
                              , GROUP_CONCAT(title SEPARATOR ', ') AS Title
                         FROM album 
                         GROUP BY band_id 
                         HAVING COUNT(*) > 1) x ON b.band_id = x.band_id 
WHERE x.band_id IS NOT NULL

SQLFiddle

答案 2 :(得分:0)

您可以尝试此查询。您需要使用group_concat()JOIN来获取所有标题。在这里查看演示小提琴http://sqlfiddle.com/#!2/3d689/3

select b.name,tab.new_title
from band b
inner join
(
  select `band_id`, 
  group_concat(`title`) as new_title
from album
group by `band_id`
having count(*) > 1
 ) tab on b.`band_id` = tab.`band_id`