【发布时间】:2017-09-07 14:35:12
【问题描述】:
所以我使用如下查询来搜索歌曲,但“黑鸟”部分是用户输入并且可以更改。
SELECT * FROM song_table WHERE artistName LIKE '%blackbird%' OR
songTitle LIKE '%blackbird%' LIMIT 10
我得到如下结果:
{
"data":
[
{
"songTitle": "Blackbird",
"artistName": "The Beatles",
},
{
"songTitle": "Blackbird (Take 4)",
"artistName": "The Beatles",
},
{
"songTitle": "Blackbird (2009 Stereo Remaster)",
"artistName": "The Beatles",
},
{
"songTitle": "Blackbird (2009 Mono Remaster)",
"artistName": "The Beatles",
}
]
}
那么如何使用 MySQL 或 PHP 过滤结果,以便只返回一首披头士“黑鸟”歌曲,而不是返回 4 首不同标题的同一首歌曲?此外,我需要以某种方式执行此操作,以便我仍有 10 首歌曲结果要返回。
【问题讨论】:
-
您是否关心返回同一艺术家的哪些匹配项?
-
这不是最好的做法,因为分组确实应该总是伴随着一个聚合函数,但是你可以
GROUP BY artistName。 -
如果披头士乐队也有一首名为“This Is Anti-Blackbird”的歌曲,与歌曲“Blackbird”完全不同,那么期望的行为会是什么?你想要这两个还是只一个?
-
'如果他们有“这是反黑鸟”,我会想要两者'。然后真的没有简单的方法可以做到这一点,除非您的表格中有类似
relatedTo或variantOf的列,您可以在其中将歌曲标记为与其他歌曲相关。然后,您可以排除该列中有值的歌曲。否则,系统如何知道你想要哪些结果,你不想要哪些结果? -
如果歌曲名为“Fly (Blackbird Fly)”并且您希望它作为“blackbird”搜索的结果返回,则该解决方案将失败。或者,如果标题是“Rocking Blackbird (feat. Joe Awesome)”。另外,我在之前的评论中并没有说排除“(”是不好的(即使,对于你想要完成的事情,它可能是不好的)。我是说使用
GROUP BY而不使用聚合函数是不是好习惯。