【问题标题】:Mysql join making all joinMysql join 使所有连接
【发布时间】:2019-06-13 15:13:46
【问题描述】:

我正在尝试将数据库访问到两个表。在商店中,我保留了一个事件列表,其中包含一个

Table Event
id, name,datei,houri, dateF,Hourf ,capacity, age ,description,image,url, local

Table Assistance
visibility, event, client

访问给定 ID 的事件列表

SELECT * from event where local = '1'

查看参加活动的人数

SELECT count (*) as assistants FROM Assistance WHERE event = '1'

但是把我拥有的两件事放在一起

SELECT e. *, COUNT (a.client) AS asis FROM event e LEFT JOIN assistance to ON e.eid = a.event where e.locales = '1' GROUP BY a.evento

在后者中,他带我参加他想要的活动,有时只有在他有帮助的情况下。

使用mysql,所有join都不可用。

我尝试调试不同的选项,但没有成功。如果有必要做出贡献或澄清,请指出我。数字 1 就是一个例子。

【问题讨论】:

标签: mysql sql join left-join


【解决方案1】:

您正在按LEFT JOINsecond 表中的列进行聚合。这可能是NULL。您想按第一个表聚合;如果你使用单列,它应该是主键或唯一的。

所以:

SELECT e.*, COUNT(a.event) AS asis  -- if you want to count matches, use a key in the ON clause
FROM event e LEFT JOIN
     assistance a
     ON e.eid = a.event 
WHERE e.locales = 1  -- looks like a number so I assume it is and removed the single quotes
GROUP BY e.eid;

【讨论】:

  • 这将返回 INNER JOIN 而不是 e.locales = 1 应该在 ON 子句中?
  • @RaymondNijland 。 . .它在第一个表上进行过滤,所以它属于WHERE 子句。
  • “它在第一个表上进行过滤,所以它属于 WHERE 子句。” 那么不清楚 topicstarter 之后的结果是否 topicstarter 将使用 locales不存在的值他会得到一个结果,就像INNER JOIN 看到this
  • @Fer 。 . .您是否有理由不接受此答案?
【解决方案2】:

要从相关表中获取计数,我们可以在选择列表中执行相关子查询

SELECT e.*
     , ( SELECT COUNT(1)
           FROM assistance a
          WHERE a.event = e.eid
       ) AS asis
  FROM event e
 WHERE e.locales = '1'

或者我们可以在内联视图中进行聚合,然后加入该视图

SELECT e.*
     , IFNULL(c.cnt,0) AS asis
  FROM event e
  LEFT
  JOIN ( SELECT a.event
              , COUNT(1) AS cnt
           FROM assistance a
          GROUP
             BY a.event
       ) c
    ON c.event = e.eid
 WHERE e.locales = '1'

规范(即查询应该返回什么)从问题中不清楚,只有损坏的 SQL 可以通过,我们只是在猜测规范。

【讨论】:

    猜你喜欢
    • 2013-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-25
    • 2012-05-01
    • 2018-02-28
    • 1970-01-01
    相关资源
    最近更新 更多