我遇到了运行查询的问题。 我有三张桌子:
类别
| id | name |
| --- | ---------- |
| 1 | Logo |
| 2 | Poster |
| 3 | Stationary |
| 4 | Web |
| 5 | Projects |
| 6 | Sporadic |
照片
| id | portid | image | preveiw |
| --- | ------ | ---------------- | ------- |
| 171 | 30 | a30preview.jpg | 1 |
| 172 | 30 | b30.jpg | |
| 173 | 30 | c30.jpg | |
| 174 | 32 | a32preview.jpg | 1 |
| 175 | 32 | b32.jpg | |
| 176 | 33 | a33preview.jpg | 1 |
| 179 | 33 | b33.jpg | |
| 180 | 41 | a41preview.jpg | 1 |
组合
| id | catid | type | title | text | date |
| --- | ------ | ----- | ------------ | ------------ | ------ |
| 30 | 2 | M | xxxxxxxx | xxxxxxxx | xxxxxx |
| 32 | 2 | M | xxxxxx | xxxxxx | xxxxxx |
| 33 | 2 | L | xxxxxxxxxx | xxxxxxxxxx | xxxxxx |
| 41 | 1 | L | xxxx | xxxx | xxxxxx |
| 45 | 2 | L | xxxxx | xxxxx | xxxxxx | <-(This record has no image in 'photos' table, so it's not in 'output')
我希望将这些记录作为输出(其中name =&#39; Poster&#39;)
| id | catid | name | type | title | text | date | image <-(first image is the one that has 'photos.preview' = 1)|
| --- | ------ | -------- | ----- | ------------ | ------------ | ------ | ---------------------------------- |
| 30 | 2 | Poster | M | xxxxxxxx | xxxxxxxx | xxxxxx | a30preview.jpg, b30.jpg, c30.jpg |
| 32 | 2 | Poster | M | xxxxxx | xxxxxx | xxxxxx | a32preview.jpg, b32.jpg |
| 33 | 2 | Poster | L | xxxxxxxxxx | xxxxxxxxxx | xxxxxx | a33preview.jpg, b33.jpg |
我试过这个sql语句:
select * from `portfolios`
inner join `categories` on `portfolios`.`catid` = `categories`.`id`
inner join `photos` on `portid` = `portfolios`.`id`
where `categories`.`name` = "Poster"
当然它不起作用,因为我不知道应该放置GROUP_CONCAT
的位置。有什么想法吗?
答案 0 :(得分:2)
SELECT portfolios.*, categories.*, GROUP_CONCAT(photos.image) AS image
FROM `portfolios`
inner join `categories` on `portfolios`.`catid` = `categories`.`id`
inner join `photos` on `portid` = `portfolios`.`id`
where `categories`.`name` = "Poster"
GROUP BY portfolios.id
答案 1 :(得分:2)
考虑到GROUP_CONCAT()
是一个聚合函数,您必须使用GROUP BY
来获得所需的结果集。你可以试试这个:
SELECT
`portfolios`.*,
`categories`.*,
GROUP_CONCAT(
`photos`.`image`
ORDER BY `photos`.`preveiw` DESC
SEPARATOR ', '
) as `image`
FROM
`portfolios`
INNER JOIN `categories` ON `portfolios`.`catid` = `categories`.`id`
INNER JOIN `photos` ON `portid` = `portfolios`.`id`
WHERE
`categories`.`name` = 'Poster'
GROUP BY
`portfolios`.`id`
答案 2 :(得分:1)
如果拼出列而不是使用*:
,将会容易得多select p.id, p.catid, c.name, p.type, p.title
, p.text, p.date. group_concat(ph.image order by case when ph.previw = 1
then 0 else 1
end) as images
from `portfolios` p
join `categories` c
on p.`catid` = c.`id`
join `photos` ph
on ph.`portid` = p.`id`
where c.`name` = "Poster"
group by p.id, p.catid, c.name, p.type, p.title
, p.text, p.date