【问题标题】:How to use SQL LIKE statement and filter results that are too similar in MYSQL or PHP如何使用 SQL LIKE 语句和过滤 MYSQL 或 PHP 中过于相似的结果
【发布时间】: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”完全不同,那么期望的行为会是什么?你想要这两个还是只一个?
  • '如果他们有“这是反黑鸟”,我会想要两者'。然后真的没有简单的方法可以做到这一点,除非您的表格中有类似relatedTovariantOf 的列,您可以在其中将歌曲标记为与其他歌曲相关。然后,您可以排除该列中有值的歌曲。否则,系统如何知道你想要哪些结果,你不想要哪些结果?
  • 如果歌曲名为“Fly (Blackbird Fly)”并且您希望它作为“blackbird”搜索的结果返回,则该解决方案将失败。或者,如果标题是“Rocking Blackbird (feat. Joe Awesome)”。另外,我在之前的评论中并没有说排除“(”是不好的(即使,对于你想要完成的事情,它可能是不好的)。我是说使用 GROUP BY 而不使用聚合函数是不是好习惯。

标签: php mysql sql sql-like


【解决方案1】:

你可以改为选择

songTitle LIKE 'blackbird'

那么你只会得到第一个结果。

【讨论】:

  • 如果这首歌真的叫黑鸟呢?
【解决方案2】:

不要使用LIKE '% text %',而是在您的查询中使用= 'blackbird'。因为LIKE %% 用于匹配文本,无论匹配文本之前或之后的文本是什么。但是当你使用=时,只会返回匹配的记录。

【讨论】:

  • 我认为 OP 确实想要使用 LIKE %% 逻辑,他们只是不想要我们作为人类实际上识别为同一首歌曲的多个变体。
  • 是的,我更喜欢使用 '%%' 逻辑,因为如果用户只是搜索 'beatles',他们只会在使用 '%%' 时获得结果,尽管不使用 '%%' 可以解决问题在我上面的例子中。
【解决方案3】:

您可以使用当前查询并添加GROUP BY 条件。见下文

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

【讨论】:

  • 如果披头士有一首名为 A Crow is Just a Blackbird 的歌曲会怎样?
  • 幸好他们没有!我同意@Patrick-Q,如果您有相关的专栏。当然你可以使用NOT LIKE '%(%',但这不会在 100% 的时间里起作用。取决于用途。这超出了他最初的问题。
  • 是的,我意识到很多歌曲的标题中都有“(ft. kanye west)”之类的东西,所以这是一个不好的解决方案。不过,我在这个数据表中有将近一百万首歌曲,所以我不能只浏览并将每首歌曲标记为重复。
猜你喜欢
  • 1970-01-01
  • 2012-05-09
  • 2011-08-14
  • 2011-06-22
  • 1970-01-01
  • 2016-11-08
  • 1970-01-01
  • 1970-01-01
  • 2013-02-28
相关资源
最近更新 更多