Элементы группы Sql с одинаковым значением в той же таблице в другом столбце - PullRequest
0 голосов
/ 04 февраля 2019

изображение таблицы ресурсов

Приведенное выше изображение является изображением таблицы ресурсов сайта, для которого создается приложение для 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

itотобразит все указанные выше значения таблицы в приложении.

Пожалуйста, мне нужен запрос, который сгруппирует элементы с таким же 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"},

Если вы внимательно смотрите все времена с одним и тем же идентификатором, это объединено в одно,

Пожалуйста, помогите мне.

1 Ответ

0 голосов
/ 04 февраля 2019

Я понимаю, что когда есть записи с одинаковым 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
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...