在另一列的同一表中具有相同值的SQL组项目

时间:2019-02-03 21:21:23

标签: mysql sql

image of resource table

上面的图像是正在为其构建Android应用程序的站点的资源表的图像。请为我的英语不好和解释不力而感到抱歉,我将尽我所能解释。我有一个称为资源的表,如下所示,它是另一个称为产品的表的一部分。产品表存储有关产品的信息,资源表存储图像名称和存储方向。每个图像都有单独的一行。现在,如果我尝试运行查询以链接或加入产品和资源表,由于资源的图像,我开始获取重复/重复的输出值。

下面是产品表

  pk_i_id | fk_i_user_id | p_name | p_description |  etc
    1       4              iphone     Iphone X  
    2       4              Cloth      Gucci     
    3       6              watch      Rolex Watch   
    4       3              car        Venza     
    5       7              tractor    CAT   
    6       9              Fruits     Melon     

下面是资源表

pk_i_id | fk_i_item_id | s_name | s_extension | s_content_type | s_path
    1     2             xDSDki0F    jpg         image/jpeg       oc-content/uploads/0/
    2     2             GAsk8vqW    jpg         image/jpeg       oc-content/uploads/0/
    3     3             D033Znu1    jpg         image/jpeg       oc-content/uploads/0/
    4     3             yZSPKeCj    jpg         image/jpeg       oc-content/uploads/0/
    5     5             rc8wCLOQ    jpg         image/jpeg       oc-content/uploads/0/
    6     5             tUWBh6vk    jpg         image/jpeg       oc-content/uploads/0/
    8     6             v3rSPl9s    jpg         image/jpeg       oc-content/uploads/0/
    9     7             8FTuKvgl    jpg         image/jpeg       oc-content/uploads/0/
    10    7             fzb2KzYq    jpg         image/jpeg       oc-content/uploads/0/
    11    7             9Qs7MgUl    jpg         image/jpeg       oc-content/uploads/0/
    12    8             3HmpjxC7    jpg         image/jpeg       oc-content/uploads/0/
    13    8             VF4M6PrE    jpg         image/jpeg       oc-content/uploads/0/
    14    8             tnIH7LqU    jpg         image/jpeg       oc-content/uploads/0/
    15    8             M5jKALrD    jpg         image/jpeg       oc-content/uploads/0/
    16    9             vBBSSfoD    jpg         image/jpeg       oc-content/uploads/0/

如果我执行这样的查询

select * products p, resource r where p.pk_i_id=r.fk_i_item_id

由于资源映像存储的多个部分,它将给我多个重复查询。如果“关于汽车的图像”为3,则查询将重复显示三次汽车。

从上表中判断,如果我尝试使用以下查询从此处获取信息

select * from osoe_t_item_resource

它将在应用程序中显示所有高于表值的那些东西。

请我需要一个查询,将与另一个列示例具有相同fk_i_item_id的项目分组

而不是像下面这样显示

{"NewsApp":[
{"pk_i_id":"1","fk_i_item_id":"2","s_name":"xDSDki0F
{"pk_i_id":"2","fk_i_item_id":"2","s_name":"GAsk8vqW
{"pk_i_id":"3","fk_i_item_id":"3","s_name":"D033Znu1"},
{"pk_i_id":"4","fk_i_item_id":"3","s_name":"yZSPKeCj"},
{"pk_i_id":"5","fk_i_item_id":"5","s_name":"rc8wCLOQ"},
{"pk_i_id":"6","fk_i_item_id":"5","s_name":"tUWBh6vk"},
{"pk_i_id":"8","fk_i_item_id":"6","s_name":"v3rSPl9s"},
{"pk_i_id":"9","fk_i_item_id":"7","s_name":"8FTuKvgl"},
{"pk_i_id":"10","fk_i_item_id":"7","s_name":"fzb2KzYq"},
{"pk_i_id":"11","fk_i_item_id":"7","s_name":"9Qs7MgUl"},
{"pk_i_id":"12","fk_i_item_id":"8","s_name":"3HmpjxC7"},
{"pk_i_id":"13","fk_i_item_id":"8","s_name":"VF4M6PrE"},
{"pk_i_id":"14","fk_i_item_id":"8","s_name":"tnIH7LqU"},
{"pk_i_id":"15","fk_i_item_id":"8","s_name":"M5jKALrD"},
{"pk_i_id":"16","fk_i_item_id":"9","s_name":"vBBSSfoD"},
{"pk_i_id":"17","fk_i_item_id":"9","s_name":"kUt65zVb"},
{"pk_i_id":"18","fk_i_item_id":"9","s_name":"D5DXAszv"},

它应该像这样输出

{"NewsApp":[
{"pk_i_id":"1","fk_i_item_id":"2","s_name":"xDSDki0F","s_name2":"GAsk8vqW"},
{"pk_i_id":"3","fk_i_item_id":"3","s_name":"D033Znu1","s_name2":"yZSPKeCj"},
{"pk_i_id":"5","fk_i_item_id":"5","s_name":"rc8wCLOQ","s_name2":"tUWBh6vk"},
{"pk_i_id":"8","fk_i_item_id":"6","s_name":"v3rSPl9s"},
{"pk_i_id":"9","fk_i_item_id":"7","s_name":"8FTuKvgl","s_name2":"fzb2KzYq","s_name3":"9Qs7MgUl"},
{"pk_i_id":"12","fk_i_item_id":"8","s_name":"3HmpjxC7"},
{"pk_i_id":"13","fk_i_item_id":"8","s_name":"VF4M6PrE","s_name2":"tnIH7LqU","s_name":"M5jKALrD"},
{"pk_i_id":"16","fk_i_item_id":"9","s_name2":"vBBSSfoD"},
{"pk_i_id":"17","fk_i_item_id":"9","s_name":"kUt65zVb","s_name2":"D5DXAszv"},

如果您密切注意始终将具有相同ID的ID合并为一,

请帮帮我。

1 个答案:

答案 0 :(得分:0)

我要强调的是,当有fk_i_item_id相同的记录时,您只想保留pk_i_id最低的记录。

如果您使用的是MySQL 8.0,则使用窗口函数ROW_NUMBER()可以很简单:

SELECT x.pk_i_id, x.fk_i_item_id, x.s_name
FROM (
    SELECT
        r.*, 
        ROW_NUMBER() OVER(PARTITION BY r.fk_i_item_id ORDER BY r.pk_i_id) rn
    FROM resource r
) x WHERE x.rn = 1

内部查询对fk_i_item_id组中的每个记录进行排名,而外部查询则过滤出重复项。


如果运行的是MySQL的早期版本,则可以将NOT EXIST条件与相关子查询一起使用,以确保不存在具有相同fk_i_item_id和较低pk_i_id的其他记录:

SELECT r.pk_i_id, r.fk_i_item_id, r.s_name
FROM resource r
WHERE NOT EXISTS (
    SELECT 1 
    FROM resource r1 
    WHERE r1.fk_i_item_id = r.fk_i_item_id AND r1.pk_i_id < r.pk_i_id
)
相关问题