【问题标题】:MySQL: Shouldn't this return more rows?MySQL:这不应该返回更多行吗?
【发布时间】:2011-10-16 02:33:41
【问题描述】:

我正在对一张表进行简单的 LIKE 搜索,但由于某种原因,我似乎无法获得多个结果。在下面的查询示例中,我包含了诸如“永不退缩”和“灵魂冲浪者”之类的词,但我只得到了一部电影。我的数据库中有这些电影,还有很多其他的。

这是查询:

SELECT movies . * , GROUP_CONCAT( categories.name ) AS categories, GROUP_CONCAT( categories.id ) AS categories_id
FROM movies
LEFT JOIN movies_categories ON ( movies.id = movies_categories.movie_id ) 
LEFT JOIN categories ON ( movies_categories.category_id = categories.id ) 
WHERE movies.movie_title LIKE  '%surfer%'
OR movies.movie_title LIKE  '%date%'
OR movies.movie_title LIKE  '%never%'
OR movies.movie_title LIKE  '%back%'
OR movies.movie_title LIKE  '%down%'
OR movies.movie_title LIKE  '%surfer%'
OR movies.movie_title LIKE  '%soul%'
OR movies.movie_title LIKE  '%the%'
OR movies.movie_title LIKE  '%transporter%'
LIMIT 0 , 30

我在想这个查询一定有问题,否则它会返回所有结果?我知道有些词在like 子句中重复,但这不重要。我错过了什么吗?


修好了!

我使用的 group_concat() 函数导致查询只返回一个结果,并将所有电影的类别和 category_id 连接起来。我刚刚删除了 group_concat(),它现在可以工作了。

【问题讨论】:

    标签: mysql search sql-like


    【解决方案1】:

    您正在使用GROUP_CONCAT,它是一个聚合函数,可将您的结果合并为一个。

    添加GROUP BY 子句:

    SELECT movies . * , GROUP_CONCAT( categories.name ) AS categories, GROUP_CONCAT( categories.id ) AS categories_id
    FROM movies
    LEFT JOIN movies_categories ON ( movies.id = movies_categories.movie_id ) 
    LEFT JOIN categories ON ( movies_categories.category_id = categories.id ) 
    WHERE movies.movie_title LIKE  '%surfer%'
    OR movies.movie_title LIKE  '%date%'
    OR movies.movie_title LIKE  '%never%'
    OR movies.movie_title LIKE  '%back%'
    OR movies.movie_title LIKE  '%down%'
    OR movies.movie_title LIKE  '%surfer%'
    OR movies.movie_title LIKE  '%soul%'
    OR movies.movie_title LIKE  '%the%'
    OR movies.movie_title LIKE  '%transporter%'
    GROUP BY
            movies.id
    LIMIT 0 , 30
    

    另外,如果你的movies 表是MyISAM,你可以运行这个:

    SELECT  movies.*,
            GROUP_CONCAT(categories.name) AS categories,
            GROUP_CONCAT(categories.id) AS categories_id
    FROM    movies
    LEFT JOIN
            movies_categories
    ON      movies_categories.movie_id = movies.id
    LEFT JOIN
            categories
    ON      categories.id = movies_categories.category_id 
    WHERE   MATCH(movie_title) AGAINST ("never back down" IN BOOLEAN MODE)
    GROUP BY
            movies.id
    LIMIT  0, 30
    

    如果您创建FULLTEXT 索引,此查询将运行得更快:

    CREATE FULLTEXT INDEX fx_movies_title ON movies (movie_title)
    

    【讨论】:

    • 你在我用解决方案编辑我的答案时写了这个,呵呵。不过谢谢,标记为已接受。
    • 全文听起来不错。我必须定期运行最后一个查询来索引数据库还是只需要一次?如果只有一次,那我一定会去的。哦,在最后一个查询中你写了“fx_movies_title”,它代表什么?谢谢!
    • 对不起,如果我现在向 cmets 发送垃圾邮件,但使用您的代码时出现语法错误。这是我的完整查询:link
    • @qwerty: fx_movies_title 是索引名称,选择您喜欢的任何索引名称。不,您只需索引一次表,之后该索引将由数据库维护。您的链接不包含您收到的错误消息。此外,从查询中删除 DISTINCT,您不需要它,因为 movies.idPK 并且您正在对其进行分组。
    • @qwerty:你错过了WHERE 子句。
    猜你喜欢
    • 2014-05-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-16
    • 1970-01-01
    • 1970-01-01
    • 2013-06-19
    • 2012-06-06
    相关资源
    最近更新 更多