两个表
表 1 - 客户表
user_id Name
1 first
2 Second
表 2 - customer_activity 表
user_id type
1 downloaded_software
1 filled_download_form
2 downloaded_software
2 filled_download_form
2 purchased
目标 - 选择所有已下载软件、填写下载表格并购买的客户。
我的查询
SELECT SQL_CALC_FOUND_ROWS DISTINCT(c.user_id)
FROM customer AS c
INNER JOIN customer_activity AS ca ON ca.user_id = c.user_id
WHERE ca.type IN('downloaded_software','filled_download_form','purchased')
ORDER BY c.user_id asc
LIMIT 0, 100
结果
1
2
期望的结果
2
编辑: 评论总结:
这个问题的答案如下,但一个可能的好方案是从列表中排除一些项目。 例如,如果我想搜索已下载_software、filled_software_form 但未购买的客户。
@Serpiton 在这个 fiddle 中回答了这个问题在评论中。
最佳答案
您可以按 user_id
分组并计算 type
的不同值。由于 WHERE 将值限制为只有 3 个可能,因此如果找到所有不同值,则不同值的计数应为 3;
SELECT SQL_CALC_FOUND_ROWS c.user_id
FROM customer AS c
JOIN customer_activity AS ca ON ca.user_id = c.user_id
WHERE ca.type IN('downloaded_software', 'filled_download_form', 'purchased')
GROUP BY c.user_id
HAVING COUNT(DISTINCT ca.type) = 3
ORDER BY c.user_id
LIMIT 0, 100
编辑:要从评论中回答你的问题,如果你需要排除一个类型,你不能轻易地使用 GROUP BY 来找到结果。您可以按类型进行自连接(左连接排除的类型并检查它是否没有行);
SELECT SQL_CALC_FOUND_ROWS c.user_id
FROM customer AS c
JOIN customer_activity AS ca1
ON ca1.user_id = c.user_id AND ca1.type = 'downloaded_software'
JOIN customer_activity AS ca2
ON ca2.user_id = c.user_id AND ca2.type = 'filled_download_form'
LEFT JOIN customer_activity AS ca3
ON ca3.user_id = c.user_id AND ca3.type = 'purchased'
WHERE ca3.user_id IS NULL
ORDER BY c.user_id
LIMIT 0, 100
...或者 - 效率不高,但如果您自动生成查询可能会更容易 - 您可以使用 3 个简单的子查询使用 IN
和 NOT IN
来完成选择是否应包含该类型...
SELECT SQL_CALC_FOUND_ROWS c.user_id
FROM customer AS c
WHERE c.user_id IN (
SELECT user_id FROM customer_activity WHERE type='downloaded_software'
) AND c.user_id IN (
SELECT user_id FROM customer_activity WHERE type='filled_download_form'
) AND c.user_id NOT IN (
SELECT user_id FROM customer_activity WHERE type='purchased'
)
ORDER BY c.user_id
LIMIT 0,100;
关于mysql - 来自多个表 MySQL 的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24255540/