Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 来自多个表的结果_Mysql_Sql_Join - Fatal编程技术网

Mysql 来自多个表的结果

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

两张桌子

表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            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表示需要缺少参数

例如,要回答另一个问题,只针对既没有填写下载表也没有购买的客户。什么