如何在MYSQL或PHP中使用类似SQL的语句和筛选结果

如何在MYSQL或PHP中使用类似SQL的语句和筛选结果,php,mysql,sql,sql-like,Php,Mysql,Sql,Sql Like,因此,我使用如下查询来搜索歌曲,但“blackbird”部分是用户输入,可以更改 SELECT * FROM song_table WHERE artistName LIKE '%blackbird%' OR songTitle LIKE '%blackbird%' LIMIT 10 我得到的结果如下: { "data": [ { "songTitle": "Blackbird", "artistName": "The Beatles", },

因此,我使用如下查询来搜索歌曲,但“blackbird”部分是用户输入,可以更改

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个歌曲结果要返回。

您可以使用当前查询并添加一个
分组条件。见下文

SELECT
*
FROM song_table
WHERE artistName LIKE '%blackbird%'
      OR songTitle LIKE '%blackbird%'
GROUP BY
    artistName
LIMIT 10;

您可以使用当前查询并添加
分组依据
条件。见下文

SELECT
*
FROM song_table
WHERE artistName LIKE '%blackbird%'
      OR songTitle LIKE '%blackbird%'
GROUP BY
    artistName
LIMIT 10;
你可以改为使用se

歌名像“黑鸟”

然后您将只得到第一个结果。

您可以改为使用se

歌名像“黑鸟”



然后您将只得到第一个结果。

在查询中使用
='blackbird'
而不是像“%text%”那样使用
。As
LIKE%%
用于匹配文本,而不管匹配文本之前或之后是什么文本。但是当您使用
=
时,只返回匹配的记录。

在查询中使用
='blackbird'
而不是像“%text%”这样使用
。As
LIKE%%
用于匹配文本,而不管匹配文本之前或之后是什么文本。但是当您使用
=
时,只有匹配的记录是返回的。

您关心来自同一艺术家的哪些匹配被返回吗?这不是最好的做法,因为分组实际上应该始终伴随着聚合函数,但是你可以按艺人的名字分组。如果披头士乐队也有一首歌叫“这是反黑鸟”,而这首歌与“黑鸟”一点也不相似,你希望的行为会是什么?你想要这两个还是只有一个?’如果他们有“这是反黑鸟”,我想要两个。除非在表中有一个类似于
relatedTo
variantOf
的列,在该列中可以将歌曲标记为与其他歌曲相关,否则很难做到这一点。然后可以排除该列中有值的歌曲。否则,系统如何知道您想要哪些结果,哪些不想要?如果歌曲名为“Fly(Blackbird Fly)”,并且您希望它作为“Blackbird”搜索的结果返回,则该解决方案将失败。或者如果标题是“摇摆黑鸟(壮举,乔真棒)”。另外,我在之前的评论中没有说排除“(”是不好的(尽管,对于你想要完成的事情来说,它可能是不好的)。我是说,在不使用聚合函数的情况下使用
GROUP BY
不是一种好的做法。您是否关心返回来自同一艺术家的哪些匹配项?这不是最好的做法,因为分组确实应该始终伴随聚合函数,但您可以
按artistName
分组如果披头士乐队也有一首歌叫“这是反黑鸟”,这首歌和“黑鸟”一点也不像?你想要这两首还是只有一首?如果他们有“这是反黑鸟”我想两者都要。这样做真的不容易,除非你的表中有一个
relatedTo
variantOf
列,你可以将歌曲标记为与其他歌曲相关。然后你可以排除该列中有值的歌曲。否则,系统如何知道你的结果想要而你不想要?如果歌曲名为“苍蝇(黑鹂苍蝇)”,你希望它作为“黑鹂”搜索的结果返回,或者如果标题是“摇摆黑鹂(壮举,乔棒极了)”,那么这个解决方案就失败了。另外,我在之前的评论中没有说排除(“是坏的”)(尽管如此,对于你想要实现的目标来说,这可能是不好的)。我是说,在没有聚合函数的情况下使用
groupby
不是一个好的做法。我认为OP确实合理地希望使用
比如%
逻辑,他们只是不希望我们人类识别为实际上是同一首歌的多种变体。是的,我更喜欢使用“%”逻辑,因为如果用户只搜索“beatl”es“他们只会在使用“%”的情况下得到结果,尽管不使用“%”解决了我上面示例中的问题。我认为OP确实合理地希望使用像%%
这样的
逻辑,他们只是不希望我们人类识别为同一首歌曲的多个变体。是的,我更喜欢使用“%”逻辑,因为如果用户只是使用“披头士”他们只有在使用“%”的情况下才会得到结果,但不使用“%”解决了我上面示例中的问题。如果披头士乐队有一首名为《乌鸦只是一只黑鸟》的歌曲,会发生什么?幸好他们没有!如果你有一个相关列,我同意@Patrick-Q。确定你可以使用
not LIKE'%(“
但这不会在100%的情况下都起作用。这取决于使用情况。这超出了他最初的问题。是的,我意识到很多歌曲都有”(坎耶·韦斯特)“或标题中的某些东西,所以这是一个糟糕的解决方案。虽然我在这个数据表中有将近一百万首歌曲,但我不能只是浏览并将每首歌曲都标记为副本。如果披头士乐队有一首名为“乌鸦”的歌,那会发生什么?幸好他们没有!我同意@Patrick-Q,如果你有一个与之相关的专栏。当然你可以使用
不像“%”(“%”
,但这并不是100%都能做到的。这取决于使用情况。这超出了他最初的问题。是的,我意识到很多歌曲都有(英国《金融时报》kanye west)“或标题中的某个问题,这是一个糟糕的解决方案。虽然我在这个数据表中有将近一百万首歌曲,但我不能只是浏览并将每首歌曲都标记为重复歌曲。如果这首歌实际上被称为黑鹂呢?如果这首歌实际上被称为黑鹂呢?