0

在 MySQL 上有点挣扎。我找到了GROUP_CONCAT适合我需要的功能,但我不知道如何使用它。我想做的是在几列以及 concat 列中进行搜索;所以如果任何一列等于我的搜索词(%a%在这个例子中)它应该被返回。我已经弄清楚如何返回连接的流派字符串,但我不知道如何搜索它。

SELECT albumArtworkURL, albumName, albumID, 
  b.artistID AS ArtistID, b.artistName AS ArtistName,
  GROUP_CONCAT(DISTINCT c.songGenre separator ',') AS genres
FROM album
LEFT JOIN artist b ON album.albumArtist = b.artistID
LEFT JOIN song c ON albumID = c.songOnAlbum
WHERE albumName LIKE '%a%' OR albumYear LIKE '%a%'
GROUP BY albumArtworkURL, albumName, albumID, ArtistID, ArtistName
ORDER BY albumYear ASC, albumName ASC

非常感谢一些帮助。谢谢 :-)

4

2 回答 2

3

要从 GROUP_CONCAT 中搜索结果,该谓词必须位于 HAVING 子句中,该子句应出现在 GROUP BY 之后和 ORDER BY 之前,例如

HAVING genres LIKE '%a%'

请注意,在访问行时,GROUP_CONCAT 表达式的值不可用,即在评估 ON 和 WHERE 子句中的谓词时。在准备好结果集之前,该表达式不可用,这就是该谓词需要在 HAVING 子句中的原因。(HAVING 子句在执行计划中很晚才被处理,在应用 LIMIT 子句之前,并且可能在满足 ORDER BY 的排序操作之前。)

于 2013-01-23T23:23:49.093 回答
2

如果要搜索 的结果GROUP_CONCAT(),则可以将查询包装在另一个选择中:

SELECT *
FROM
(
  SELECT albumArtworkURL, 
    albumName, 
    albumID, 
    b.artistID AS ArtistID, 
    b.artistName AS ArtistName,
    GROUP_CONCAT(DISTINCT c.songGenre separator ',') AS genres
  FROM album
  LEFT JOIN artist b 
    ON album.albumArtist = b.artistID
  LEFT JOIN song c 
    ON albumID = c.songOnAlbum
  GROUP BY albumArtworkURL, albumName, albumID, ArtistID, ArtistName
) src
WHERE albumName LIKE '%a%' 
  OR albumYear LIKE '%a%'
  OR genres LIKE  '%a%'
ORDER BY albumYear ASC, albumName ASC

但是除非我在你的解释中遗漏了一些东西,否则我不知道为什么你不能只搜索songGenre它的 concat 而不是它的版本:

SELECT albumArtworkURL, 
  albumName, 
  albumID, 
  b.artistID AS ArtistID, 
  b.artistName AS ArtistName,
  GROUP_CONCAT(DISTINCT c.songGenre separator ',') AS genres
FROM album
LEFT JOIN artist b 
  ON album.albumArtist = b.artistID
LEFT JOIN song c 
  ON albumID = c.songOnAlbum
WHERE albumName LIKE '%a%' 
  OR albumYear LIKE '%a%'
  OR songGenre LIKE '%a%'
GROUP BY albumArtworkURL, albumName, albumID, ArtistID, ArtistName
ORDER BY albumYear ASC, albumName ASC
于 2013-01-23T23:26:18.653 回答