【发布时间】:2017-04-23 08:04:16
【问题描述】:
场景: 我有一张要获取的工作表。每个作业都有一个或多个与之关联的项目,这些项目存储在 jobItems 表中。项目的代码和详细信息保存在项目表中。 jobs 和 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
正如您所注意到的,jobItems.jobId 上有一个 LEFT JOIN 和一个 GROUP BY,它们在实现基于项目的作业过滤器时会产生问题。
尝试过的选项:
- 我试图删除 GROUP BY 和 GROUP_CONCAT,所以它会返回 所有可能的工作项目组合。我想操纵他们 在后端使用 php。但它有一个缺点,它扰乱了 分页。
- 我还尝试将 LEFT JOIN 动态更改为 INNER JOIN 和 在子查询中,我在 INNER JOIN INNER JOIN 上添加了一个条件 items ON jobItems.itemId = items.id AND jobItems.itemId IN (1) 但是, 由于 GROUP BY,它不会获取所需的结果 只返回只有一项具有给定 itemId 的作业。 它不会返回具有多个项目的作业,包括项目 itemId= 1。
简而言之,我想获取所有包含 itemId = 1 的项目的作业。预期结果是 job1 和 job2,因为它们都包含 item1。
【问题讨论】:
-
您的预期结果是什么?
-
@Madhivanan 我已经编辑了问题并在其中添加了预期结果。
-
job3 有 item1,仅供参考
-
Job3 也有 item1
-
@TimBiegeleisen ,对不起,我已经编辑了作业 3 并更正了它的项目。
标签: mysql sql database join query-optimization