Сценарий: У меня есть таблица заданий, которую я хочу получить. Каждое задание имеет один или несколько связанных с ним элементов, которые хранятся в таблице jobItems. Код и данные элемента сохраняются в таблице элементов. Между заданиями и таблицами jobItems существует взаимосвязь «один ко многим». Также имейте в виду, он имеет большой набор данных.Как фильтровать записи на основе определенного значения в подзапросе?
Я хочу показать все задания, у которых есть один конкретный элемент в их jobItems.
MySQL скрипку:http://sqlfiddle.com/#!9/4a5a47
Схема:
CREATE TABLE jobs (
`id` INT,
`jobRef` VARCHAR (55)
);
INSERT INTO jobs (`id`, `jobRef`)
VALUES
(1, 'job1'),
(2, 'job2'),
(3, 'job3');
CREATE TABLE jobItems (
`id` INT,
`itemId` INT,
`jobId` INT
);
INSERT INTO jobItems (`id`, `itemId`, `jobId`)
VALUES
(1, 1, 1),
(2, 2, 1),
(3, 3, 1),
(4, 1, 2),
(5, 2, 2),
(6, 3, 3);
CREATE TABLE items (
`id` INT,
`itemCode` VARCHAR (55)
);
INSERT INTO items (`id`, `itemCode`)
VALUES
(1, 'item1'),
(2, 'item2'),
(3, 'item3');
Запрос:
SELECT
jobs.*, ji.allItems
FROM
jobs
LEFT JOIN (
SELECT
jobItems.jobId,
GROUP_CONCAT(items.itemCode) AS allItems
FROM
jobItems
INNER JOIN items ON jobItems.itemId = items.id
GROUP BY
jobItems.jobId
) AS ji ON ji.jobId = jobs.id
Как вы заметили, есть LEFT JOIN, а также GROUP BY на jobItems.jobId, которые являются crea проблемы при внедрении фильтра заданий на основе этого элемента.
Пробовал Опции:
- Я попытался удалить GROUP BY и GROUP_CONCAT, поэтому он будет возвращать все возможные комбинации рабочих мест элементов. Я решил манипулировать ими , используя php на бэкэнд. Но у него есть один недостаток, что он нарушает разбиение на страницы .
- Я также попытался динамически изменять LEFT JOIN в INNER JOIN и внутри подзапроса, я добавил условие на INNER JOIN INNER JOIN элементы ON jobItems.itemId = items.id И jobItems.itemId В (1) Но, он не получает желаемый результат из-за GROUP BY, так как он будет вернуть только задания, которые имеют только один элемент с данным ItemId. Это не возвращает рабочие места, которые имеют несколько пунктов, включая пункт с Itemid = 1.
Короче говоря, я хочу, чтобы извлечь все рабочие места, которые имеют элементы, содержащие элемент с Itemid = 1. И ожидаемый результат job1 и job2, поскольку они оба имеют item1 в них.
Каков ваш ожидаемый результат? – Madhivanan
@Madhivanan Я отредактировал вопрос и добавил в него ожидаемый результат. –
job3 имеет item1, FYI –