【问题标题】:MySQL, GROUP_CONCAT & GROUP BYMySQL、GROUP_CONCAT 和 GROUP BY
【发布时间】:2012-05-03 06:53:46
【问题描述】:

这是我的工作查询:

SELECT 
d.*, g.name game, 
 (SELECT GROUP_CONCAT(p.name) FROM shows_players p 
  LEFT JOIN (SELECT * FROM shows_map) sm ON sm.player_id = p.id 
  WHERE sm.show_id = d.id AND sm.game_id = g.id) players 
FROM shows_dates d 
LEFT JOIN (SELECT * FROM shows_map 
           WHERE player_id = 5 GROUP BY show_id, game_id) m ON d.id = m.show_id 
LEFT JOIN shows_games g ON g.id = m.game_id

在添加“WHERE player_id =”行之前,这是一个很好的查询。然后它返回一些没有数据的行。我该如何清理并摆脱这些?

谢谢

【问题讨论】:

  • 这真是一团糟……我不太确定这里发生了什么,但是子查询等的连接可能会使查询变得非常慢。您最好问一个不同的问题:从您的目标和数据结构开始,如何进行查询以获取您的数据?
  • 我怀疑您的问题是由于 LEFT JOIN 与子查询并过滤子查询。如果可能,请避免使用 LEFT JOIN;否则,请考虑在主查询而不是子查询的(当前不存在的)WHERE 子句中进行过滤。
  • @JonathanLeffler 我相信无论何时在 m 表内部或外部使用 WHERE 都会出现性能问题。据我所知,最好在自定义表中进行过滤,而在 d-table 等普通表之外进行过滤。
  • 南妮,你可能是对的。这是我今天能得到的最好的。

标签: mysql group-by group-concat


【解决方案1】:

一个简单的解决方案可能是将LEFT JOIN (SELECT * FROM shows_map 更改为INNER JOIN (SELECT * FROM shows_map

我想你会得到一些空的 NULL 数据,因为你使用的是 LEFT JOIN。

而且你的查询很混乱。

【讨论】:

  • 正如你所说的罗宾。对第二个“(SELECT * FROM shows_map”使用INNER JOIN 解决了​​这个问题。
  • 还允许我删除“GROUP BY”。谢谢!
猜你喜欢
  • 2020-06-16
  • 1970-01-01
  • 2012-07-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-08
  • 1970-01-01
相关资源
最近更新 更多