如何在一个请求中获得用户及其所有图像?

时间:2018-09-14 07:05:42

标签: sql

我有一个具有has_many个图像联接表的用户。

我知道我可以做到:

select *
from user,
     image
join user_images on...
where user_id = 'some_id'

这将在一个请求中给我数据,但是每个图像行将重复其中的所有用户数据。

user_name, address, phone, image_1, image_1_path
user_name, address, phone, image_2, image_2_path
....

有没有办法在一个查询中做到这一点而又没有任何数据重复?

我想理想的数据响应应该是这样的:

我想理想的是这样的响应:

user_name, address, phone
image_1, image_1_path
image_2, image_2_path
...<more unique images>

2 个答案:

答案 0 :(得分:1)

据我了解,如果每个同一用户有多个图像,则希望看到空白的user_nameaddressphone。您可以在以下各项中使用ROW_NUMBER

select 
    case when rn > 1 then '' else user_name end as user_name, 
    case when rn > 1 then '' else address end as address, 
    case when rn > 1 then '' else phone end as phone,
    image,
    image_path 
from (
    select *, row_number() over(partition by user_name, address, phone order by user_name) rn 
    from user
    join user_images on...
    where user_id = 'some_id'
) x

答案 1 :(得分:0)

看着我!看着我! :)

因此,接下来我将以我的理解进行解释:

现在我有两个表:userimage

user数据结构和假设数据: enter image description here

image数据结构和假设数据: enter image description here

Ⅲ好吧,让我们选择一些类似于SQL的数据:

SELECT
    *
FROM
    `user`
LEFT JOIN image 
ON `user`.id = image.user_id

AND,结果显示: enter image description here

但是,这不是我们想要的!

Ⅳ最终SQL:

SELECT
    a.id,
    a.`name`,
    b.img
FROM
    `user` a
LEFT JOIN (
    SELECT
        user_id,
        GROUP_CONCAT(image) AS img
    FROM
        image
    GROUP BY
        user_id
) b ON a.id = b.user_id

以上SQL执行结果显示: enter image description here

Ⅴ真正的最后信息:))

这是您想要的吗?