Как выбрать только первую запись с одинаковым идентификатором ссылки (link_id)?

Как изменить этот запрос, чтобы он выбирал только первую запись с одинаковым link_id из выборки biolink_blocks? В данный момент запрос выбирает все блоки, но мне нужна только первая запись. У меня получается 3 записи с почти одним и тем же содержимым, но мне нужна только первая. Вот текущий запрос:

SELECT links.*, B.biolink_block_id, B.settings AS social
FROM links			
LEFT JOIN (
    SELECT *
    FROM biolinks_blocks
    WHERE type = 'socials'
    ORDER BY biolink_block_id ASC
    LIMIT 1
) B ON B.link_id = links.link_id
WHERE B.type = 'socials'
AND links.is_enabled = 1 
AND links.is_verified = 1
ORDER BY links.link_id ASC 
LIMIT 9
  • 3 октября 2023 г. 16:47
Ответы на вопрос 2
Для выбора только первой записи с одинаковым идентификатором ссылки (link_id) из таблицы biolinks_blocks, вам нужно изменить запрос следующим образом:

```sql
SELECT links.*, B1.biolink_block_id, B1.settings AS social
FROM links			
LEFT JOIN (
    SELECT link_id, MIN(biolink_block_id) AS min_biolink_block_id
    FROM biolinks_blocks
    WHERE type = 'socials'
    GROUP BY link_id
) AS B2 ON B2.link_id = links.link_id
LEFT JOIN biolinks_blocks AS B1 ON B1.link_id = B2.link_id AND B1.biolink_block_id = B2.min_biolink_block_id
WHERE B1.type = 'socials'
AND links.is_enabled = 1 
AND links.is_verified = 1
ORDER BY links.link_id ASC 
LIMIT 9
```

В этом запросе добавлена подзапрос, который находит минимальный biolink_block_id для каждого link_id в таблице biolinks_blocks с условием на тип 'socials'. Затем основной запрос объединяет таблицу links с этим подзапросом и фильтрует только первую запись для каждого link_id.
К сожалению, в MySQL 5.7 отсутствуют оконные функции и СТЕ. Поэтому мы можем использовать подзапрос для решения проблемы. Ниже приведено упрощенное решение, которое можно адаптировать под ваш конкретный случай:

```sql
SELECT *
FROM blocks
JOIN (
    SELECT MIN(b.id) id
    FROM blocks b
    JOIN links l ON b.link_id = l.id
    WHERE l.id = 1
) fb ON fb.id = blocks.id;
```

Вы можете использовать этот SQL-запрос для выполнения требуемой задачи.
Похожие вопросы