mysql - 来自多个表 MySQL 的结果

标签 mysql sql join

两个表

表 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

An SQLfiddle to test with .

编辑:要从评论中回答你的问题,如果你需要排除一个类型,你不能轻易地使用 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 个简单的子查询使用 INNOT 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;

An SQLfiddle showing both in action .

关于mysql - 来自多个表 MySQL 的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24255540/

相关文章:

mysql - 如何检查 CURTIME() 是否在两个不同时间之间?

mysql - 在 mySQL 的嵌套子查询中选择多列的推荐方法

sql - 从 SQL 转换为 R(连接和内部连接)

mysql - SQL查询、必要的索引、优化

mysql - Pyspark DataFrameWriter jdbc 函数的忽略选项是忽略整个事务还是只忽略有问题的行?

mysql - 使用 MAX 时,行被排除在 SQL 查询之外

sql - 查询以省略整个组,该组具有一个属性中具有特定值的记录

MySQL SELECT 连接 3 个表,并具有所有行的条件

mysql - 我如何 SQL Join 2个数据库,在一列中只有不同的结果

mysql - 复杂的 MySQL 查询给出了不正确的结果