MySQL select 带有子查询和 LIMIT
MySQL select with sub-query and LIMIT
我正在使用 subselect 来获取我需要的行 ID,如下所示:
SELECT
p.id, c.id as category_id
FROM
(SELECT id FROM products p WHERE p.id > 6319055 ORDER BY id LIMIT 1000) prods
LEFT JOIN
products p ON p.id = prods.id
LEFT JOIN
categories c ON (c.id = p.category_id)
WHERE
c.active = 1
ID 6319055 是我最后一个 selected ID。我在 select 处理数据后保存它。
现在我遇到的问题是我在每个周期 select 处理 1000 行,有时我 select 1000 行不符合
WHERE c.active = 1
要求。 Select returns 什么都没有,我没有任何行 ID 来继续子 select。
有什么办法可以解决这个问题吗?如何获取子 select 的最后一个 ID,即使它不符合 WHERE 子句?
当您在 LEFT JOIN
(外部联接)的右侧 table 使用 WHERE
条件时,它实际上变成了 INNER JOIN
,因为 WHERE
子句需要匹配条件。这就是为什么您只会收到 c.active = 1
的案例。
您需要将 WHERE
条件转换为 LEFT JOIN .. ON .. AND ..
条件:
SELECT
p.id, c.id as category_id
FROM
(SELECT id FROM products p WHERE p.id > 6319055 ORDER BY id LIMIT 1000) prods
LEFT JOIN
products p ON p.id = prods.id
LEFT JOIN
categories c ON c.id = p.category_id
AND c.active = 1
我正在使用 subselect 来获取我需要的行 ID,如下所示:
SELECT
p.id, c.id as category_id
FROM
(SELECT id FROM products p WHERE p.id > 6319055 ORDER BY id LIMIT 1000) prods
LEFT JOIN
products p ON p.id = prods.id
LEFT JOIN
categories c ON (c.id = p.category_id)
WHERE
c.active = 1
ID 6319055 是我最后一个 selected ID。我在 select 处理数据后保存它。
现在我遇到的问题是我在每个周期 select 处理 1000 行,有时我 select 1000 行不符合
WHERE c.active = 1
要求。 Select returns 什么都没有,我没有任何行 ID 来继续子 select。
有什么办法可以解决这个问题吗?如何获取子 select 的最后一个 ID,即使它不符合 WHERE 子句?
当您在 LEFT JOIN
(外部联接)的右侧 table 使用 WHERE
条件时,它实际上变成了 INNER JOIN
,因为 WHERE
子句需要匹配条件。这就是为什么您只会收到 c.active = 1
的案例。
您需要将 WHERE
条件转换为 LEFT JOIN .. ON .. AND ..
条件:
SELECT
p.id, c.id as category_id
FROM
(SELECT id FROM products p WHERE p.id > 6319055 ORDER BY id LIMIT 1000) prods
LEFT JOIN
products p ON p.id = prods.id
LEFT JOIN
categories c ON c.id = p.category_id
AND c.active = 1