【问题标题】:MySql Subquery IN returns the first result, not all resultsMySql Subquery IN 返回第一个结果,不是所有结果
【发布时间】:2012-10-04 08:24:42
【问题描述】:

我有以下疑问:

SELECT TrackID, Name, Artist, Album, TotalTime, TrackNumber, TrackCount
FROM tracks
WHERE TrackID IN (SELECT Tracks FROM playlists
                  WHERE ID='f8ad830c-e2d6-11e1-99d7-00132094'
                  LIMIT 1)
ORDER BY Artist, Album, TrackNumber

执行返回“tracks”表的第一行以包含从子查询返回的任何结果。截至目前,子查询返回:

41646,41696,41698,41700,41702,41704,41706,41708,41710,41712

当我将从子查询返回的上述值放入原始查询中时,代替子查询,它会返回我期望的所有行。

为什么子查询将返回的结果限制为第一个结果,但是用返回的结果替换子查询(在PHPMyAdmin中运行时)返回所有结果?

【问题讨论】:

  • 发生这种情况,很可能是因为,您的 Tracks 被选择为单个文本字符串,而不是像这样的逗号分隔数字:'41646,41696,41698,41700,41702,41704,41706,41708,41710,41712'

标签: php mysql subquery


【解决方案1】:
SELECT TrackID, Name, Artist, Album, TotalTime, TrackNumber, TrackCount 
  FROM tracks 
 WHERE FIND_IN_SET(TrackID
                  , (SELECT Tracks
                       FROM playlists 
                      WHERE ID='f8ad830c-e2d6-11e1-99d7-00132094' 
                      LIMIT 1
                    )
                  ) > 0
 ORDER BY Artist, Album, TrackNumber 
;

【讨论】:

  • 我不会以这种形式保留它。但这可能是你最容易理解的,形式最接近你的尝试。
  • 正如您之前提到的,将播放列表分解为每首曲目一行的列表是更自然的结构,并且可能更有效地使用适当的索引,在大多数情况下使用简单的 JOIN。
【解决方案2】:

您在子查询中说limit 1。因此,您只获得 1 个 trackid,因此只有一个轨道。

您可以将曲目拆分为多行,因此对于一个播放列表,您的行数与曲目数一样多,或者您可以将曲目字符串拆分到一个临时表中。例如查看MySQL: Split comma separated list into multiple rows 或搜索“将字符串拆分为行”

【讨论】:

  • 只有一行,用逗号分隔的列表。单行包含逗号分隔的列表。但是,我也尝试删除 LIMIT 1 并且发生了相同的结果。
  • 所以tracks 有所有trackids 用逗号分隔?
  • 是的。它实际上是我在上面加上 5 位数字的字符串。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-01-13
  • 1970-01-01
  • 1970-01-01
  • 2013-11-15
  • 1970-01-01
  • 1970-01-01
  • 2015-06-11
相关资源
最近更新 更多