如何在单个mysql查询中获得相同的结果
现在我使用两个查询来计算特定点击的联系人数量。 我尝试了很多东西,比如左连接、右连接、联合,但我可以检索到预期的结果 第一个查询如何在单个mysql查询中获得相同的结果,mysql,Mysql,现在我使用两个查询来计算特定点击的联系人数量。 我尝试了很多东西,比如左连接、右连接、联合,但我可以检索到预期的结果 第一个查询 SELECT offertId, count(*) as returnClicks from warehause where userId=8 返回 | offertId | returnClicks | | 47 | 4 | | offertId | returnContacts | | 47 | 1
SELECT offertId, count(*) as returnClicks from warehause where userId=8
返回
| offertId | returnClicks |
| 47 | 4 |
| offertId | returnContacts |
| 47 | 1 |
而第二个
SELECT offertId, count(*) as returnContacts from contact where userId=8
返回
| offertId | returnClicks |
| 47 | 4 |
| offertId | returnContacts |
| 47 | 1 |
如何进行单个查询以获得此类结果
| offertId | returnClicks | returnContacts |
| 47 | 4 | 1 |
别担心,当然,如果我没有returnClick,我不需要计算联系人数。试试这个:
SELECT COALESCE(t1.offertId, t2.offertId) AS offertId,
returnClicks, returnContacts
FROM (SELECT offertId, count(*) AS returnClicks
FROM warehause
WHERE userId=8
) AS t1
CROSS JOIN (
SELECT offertId, count(*) AS returnContacts
FROM contact
WHERE userId=8) AS t2
这两个查询始终每个返回一行,因此您可以使用交叉连接
来绑定它们
试试这个:
SELECT COALESCE(t1.offertId, t2.offertId) AS offertId,
returnClicks, returnContacts
FROM (SELECT offertId, count(*) AS returnClicks
FROM warehause
WHERE userId=8
) AS t1
CROSS JOIN (
SELECT offertId, count(*) AS returnContacts
FROM contact
WHERE userId=8) AS t2
这两个查询始终每个返回一行,因此您可以使用交叉连接
来绑定它们
第一件事:您的查询可能是1个无效的SQL,因为出现在
SELECT
子句中但未聚合的offerId
列没有出现在GROUP BY
子句中。从5.7.5版开始,MySQL拒绝了2个这样的查询。以前的版本处理它们,但它们可以作为offertId
自由返回offertId
列中由WHERE
条件选择的任何值
您确定不想在这两个查询中按OfferId分组吗
我将假设您的两个查询都包含groupbyoffertid
,以获得正确的结果
1查询有效并返回预期结果当且仅当
offertId
在功能上依赖于用户ID
;i、 e.userId
中具有特定值的所有行也共享列offerId
的值
2自版本5.7.5以来,MySQL使用默认配置拒绝使用。以前版本的MySQL用于接受此类查询,但它们为未出现在GROUP BY
子句中且未与一起使用的列返回的值是不确定的。为了让现有代码运行,可以关闭MySQL 5.7.7引入的设置。如果服务器上没有运行的旧查询,则不建议将其关闭;您最好在新代码中编写有效的SQL查询,并且不要依赖于实现细节(它们会产生不确定的结果)
如果查询被更改为包含
groupby
您可以JOIN
加入您已有的两个查询返回的结果:
SELECT *
FROM (
SELECT offertId, count(*) as returnClicks from warehause where userId=8 GROUP BY offertId
) clicks
LEFT JOIN (
SELECT offertId, count(*) as returnContacts from contact where userId=8 GROUP BY offertId
) contacts USING (offertId)
它将返回第一个子查询生成的所有行以及第二个子查询生成的结果集中的匹配行
我假设第一个子查询在offertId
中返回第二个子查询在offertId
中返回的所有值。如果他们采用另一种方式,则只需将左连接
替换为右连接
备注:如果两个子查询返回的offerId
值集未包含在另一个子查询中,则上述查询不会返回所需的所有结果。在这种情况下,您需要使用完全外部联接
(它包括两侧的所有行),但不幸的是,MySQL不支持它
否-
分组依据
解决方案
op提到他们不需要使用groupby
。在这种情况下,每个原始查询最多返回一行。如果子查询在offertId
中返回的值匹配,则上面提供的代码也会工作并返回一行,其中包含offertId
,returnClicks
和returnContacts
。如果它们不匹配(或者其中一个不返回任何行),最终结果集将丢失第二个子查询生成的值
获取结果集中所有值的可能解决方案是更改结果集的格式
此查询:
SELECT 'clicks' as kind, offertId, count(*) as number from warehause where userId=8
UNION
SELECT 'contacts' as kind, offertId, count(*) as number from contact where userId=8
生成此结果集:
| kind | offertId | number |
| clicks | 47 | 4 |
| contacts | 47 | 1 |
它包含两个查询返回的所有行,无论它们返回0行还是1行,无论offerId
的值是否匹配
列kind
告诉什么子查询生成了行,列number
告诉由相应子查询中的COUNT(*)
生成的值
这些值可以在客户端代码中以任何方式进行分析、组合和处理(假设它不是存储过程,并且客户端使用了更强大的语言).第一件事:您的查询可能是1个无效的SQL,因为出现在
SELECT
子句中但未聚合的offerId
列没有出现在GROUP BY
子句中。从5.7.5版开始,MySQL拒绝了2个这样的查询。以前的版本处理它们,但它们可以作为offertId
自由返回offertId
列中由WHERE
条件选择的任何值
您确定不想在这两个查询中按OfferId分组吗
我将假设您的两个查询都包含groupbyoffertid
,以获得正确的结果
1查询有效并返回预期结果当且仅当
offertId
在功能上依赖于用户ID
;i、 e.userId
中具有特定值的所有行也共享列offerId
的值
2自版本5.7.5以来,MySQL使用默认配置拒绝使用。以前版本的MySQL用于接受此类查询,但它们为未出现在GROUP BY
子句中且未与一起使用的列返回的值是不确定的。为了让现有代码运行,可以关闭MySQL 5.7.7引入的设置。如果服务器上没有运行的旧查询,则不建议将其关闭;您最好在新代码中编写有效的SQL查询,不要依赖im
SELECT *
FROM (SELECT 1 as tmpId, offertId, count(*) as returnClicks from warehause where userId=8) t1
INNER JOIN (SELECT 1 as tmpId, offertId, count(*) as returnContacts from contact where userId=8) t2 on t1.tmpId = t2.tmpId