Mysql — несколько запросов к одной таблице: получить полную запись одной строки + получить только следующий и предыдущий идентификатор + получить количество братьев и сестер на основе parent_id

avatar
fred DG
1 июля 2021 в 17:33
26
1
1

Я пытаюсь объединить несколько запросов, вызываемых к одной и той же таблице, и понятия не имею, как этого добиться.

Я создал 3 запроса и запускаю их один за другим. Это работает, но мне интересно, как построить эти 3 запроса за 1 запуск.

I — Получить всю строку

SELECT * FROM sp_products_items WHERE id='.$id

II — Получить количество "братьев и сестер"

SELECT count(*) FROM sp_products_items WHERE parent_id = $result->parent_id

III - Получить предыдущий и следующий идентификаторы (на основе поля подсчета)

ВЫБРАТЬ
(SELECT id FROM sp_products_items WHERE order= $result->order + 1) как следующий,
(ВЫБЕРИТЕ id FROM sp_products_items ГДЕ order= $result->order - 1) как предыдущий

Есть какие-нибудь сведения о том, как этого добиться? Это вообще возможно? Прибавит ли производительность или нет смысла объединять их в одном прогоне?

Я попробовал несколько вложенных выборок, внутреннее соединение, но безуспешно :(

Источник
Rick James
2 июля 2021 в 17:00
0

Это кажется очень маловероятным, чтобы получить правильный идентификатор. Пожалуйста, покажите нам некоторые образцы данных. Кроме того, какой $result вы надеетесь использовать?

fred DG
11 июля 2021 в 14:22
0

Ваш ответ отлично справился с задачей (мне нужны были эти данные для отображения продукта данной категории, получения следующего и предыдущего продукта этой категории, а также общего количества, содержащегося в этой категории, для целей навигации) У меня нет разрешения на проголосуйте за свой ответ...

Rick James
11 июля 2021 в 18:05
0

Рад, что это сработало. Возьмите учебник; это простой способ получить 100 очков повторения.

Ответы (1)

avatar
Rick James
2 июля 2021 в 17:09
0

Возможно что-то вроде

SELECT n.id AS next,
       p.id AS previous,
       ( SELECT COUNT(*) FROM sp_products_items WHERE id = a.parent ) AS ct
    FROM sp_products_items AS a
    LEFT JOIN sp_products_items AS n ON n.`order` = a.`order` + 1
    LEFT JOIN sp_products_items AS p ON p.`order` = a.`order` - 1
    WHERE a.id = $id

Я использовал LEFT, потому что запрос мог не закончиться. Или могут быть пробелы в нумерации — это сложнее учесть.

Я не знаю назначения COUNT(*), поэтому просто добавил его как дополнительную информацию.

sp_products_items необходимо INDEX(order)

fred DG
11 июля 2021 в 13:55
0

Эй, вот оно! (цель запроса — получить полные данные об одном продукте, классифицированном по parent_id, получить общее количество дочерних продуктов того же родителя и получить следующий и предыдущий идентификаторы для целей навигации (например, «перейти к следующему "/"общее число") Поэтому для моей цели я просто добавил "a.*," сразу после первого SELECT.