Mysql 来自多个表的结果
两张桌子 表1-客户表Mysql 来自多个表的结果,mysql,sql,join,Mysql,Sql,Join,两张桌子 表1-客户表 user_id Name 1 first 2 Second 表2-客户活动表 user_id type 1 downloaded_software 1 filled_download_form 2 downloaded_software 2 filled_download_form 2 purcha
user_id Name
1 first
2 Second
表2-客户活动表
user_id type
1 downloaded_software
1 filled_download_form
2 downloaded_software
2 filled_download_form
2 purchased
目标-选择已下载\u软件、填写\u下载表并购买的所有客户
我的问题
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
编辑:
评论摘要:
这个问题的答案如下,但一个可能的好方案是从列表中排除一些项目。
例如,如果我想搜索已下载\u软件的客户,请填写\u软件\u表但未购买
@Serpiton在评论中对此进行了回答。您可以按
用户id
进行分组,并计算类型的不同值。由于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查找结果。您可以对每个类型执行自联接(将排除的类型左联接,并检查是否不产生任何行)
…或-效率不高,但如果您自动生成查询,可能会更容易-您可以使用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;
.您可以按用户id
进行分组,并计算类型的不同值。由于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查找结果。您可以对每个类型执行自联接(将排除的类型左联接,并检查是否不产生任何行)
…或-效率不高,但如果您自动生成查询,可能会更容易-您可以使用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;
.您可以按用户id
进行分组,并计算类型的不同值。由于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查找结果。您可以对每个类型执行自联接(将排除的类型左联接,并检查是否不产生任何行)
…或-效率不高,但如果您自动生成查询,可能会更容易-您可以使用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;
.您可以按用户id
进行分组,并计算类型的不同值。由于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查找结果。您可以对每个类型执行自联接(将排除的类型左联接,并检查是否不产生任何行)
…或-效率不高,但如果您自动生成查询,可能会更容易-您可以使用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;
从带有修改的查询开始
这可能更容易阅读
整个查询相当于
SUM(CASE WHEN ca.type = 'purchased' THEN 1 ELSE 0 END) = 0
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
CASE WHEN ca.type = 'downloaded_software' THEN 1 ELSE NULL END) = 1
AND COUNT(DISTINCT
CASE WHEN ca.type = 'filled_download_form' THEN 1 ELSE NULL END) = 1
AND COUNT(DISTINCT
CASE WHEN ca.type = 'purchased' THEN 1 ELSE NULL END) = 0
ORDER BY c.user_id
LIMIT 0, 100
(如果您只有这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
CASE WHEN ca.type = 'downloaded_software'
THEN 1 ELSE NULL END) = ?downloaded?
AND COUNT(DISTINCT
CASE WHEN ca.type = 'filled_download_form'
THEN 1 ELSE NULL END) = ?filled?
AND COUNT(DISTINCT
CASE WHEN ca.type = 'purchased'
THEN 1 ELSE NULL END) = ?purchased?
ORDER BY c.user_id
LIMIT 0, 100
以下载的、填充的和购买的作为参数。1表示需要存在类型,0表示需要缺少参数
例如,要回答另一个问题,只针对既没有填写下载表也没有购买的客户。对此有什么疑问?只需相应地填写参数。免责声明:在Joachim Isaksson回答的评论中,我建议对他向OP提出的一个问题进行修改,OP要求澄清,就是这样
从带有修改的查询开始
这可能更容易阅读
整个查询相当于
SUM(CASE WHEN ca.type = 'purchased' THEN 1 ELSE 0 END) = 0
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
CASE WHEN ca.type = 'downloaded_software' THEN 1 ELSE NULL END) = 1
AND COUNT(DISTINCT
CASE WHEN ca.type = 'filled_download_form' THEN 1 ELSE NULL END) = 1
AND COUNT(DISTINCT
CASE WHEN ca.type = 'purchased' THEN 1 ELSE NULL END) = 0
ORDER BY c.user_id
LIMIT 0, 100
(如果您只有这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
CASE WHEN ca.type = 'downloaded_software'
THEN 1 ELSE NULL END) = ?downloaded?
AND COUNT(DISTINCT
CASE WHEN ca.type = 'filled_download_form'
THEN 1 ELSE NULL END) = ?filled?
AND COUNT(DISTINCT
CASE WHEN ca.type = 'purchased'
THEN 1 ELSE NULL END) = ?purchased?
ORDER BY c.user_id
LIMIT 0, 100
以下载的、填充的和购买的作为参数。1表示需要存在类型,0表示需要缺少参数
例如,要回答另一个问题,只针对既没有填写下载表也没有购买的客户。对此有什么疑问?只需相应地填写参数。免责声明:在Joachim Isaksson回答的评论中,我建议对他向OP提出的一个问题进行修改,OP要求澄清,就是这样
从带有修改的查询开始
这可能更容易阅读
整个查询相当于
SUM(CASE WHEN ca.type = 'purchased' THEN 1 ELSE 0 END) = 0
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
CASE WHEN ca.type = 'downloaded_software' THEN 1 ELSE NULL END) = 1
AND COUNT(DISTINCT
CASE WHEN ca.type = 'filled_download_form' THEN 1 ELSE NULL END) = 1
AND COUNT(DISTINCT
CASE WHEN ca.type = 'purchased' THEN 1 ELSE NULL END) = 0
ORDER BY c.user_id
LIMIT 0, 100
(如果您只有这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
CASE WHEN ca.type = 'downloaded_software'
THEN 1 ELSE NULL END) = ?downloaded?
AND COUNT(DISTINCT
CASE WHEN ca.type = 'filled_download_form'
THEN 1 ELSE NULL END) = ?filled?
AND COUNT(DISTINCT
CASE WHEN ca.type = 'purchased'
THEN 1 ELSE NULL END) = ?purchased?
ORDER BY c.user_id
LIMIT 0, 100
以下载的、填充的和购买的作为参数。1表示需要存在类型,0表示需要缺少参数
例如,要回答另一个问题,只针对既没有填写下载表也没有购买的客户。什么