加权MySql查询搜索

时间:2011-07-21 19:36:39

标签: php mysql sorting

我看了一眼,我发现了一些像我这样的问题,但他们没有解释。

我正在尝试搜索包含多列的表格。我希望顶部的匹配列数最多的行和底部最少的行。我见过几种做法。我当前和糟糕的方式是使用大量的MySQL查询和PHP来完成工作。

实施例

    +----+-----------+----------+------+-------+
    | ID | firstName | lastName | more | stuff |
    +----+-----------+----------+------+-------+
    |  1 | Bob       | Hope     |    1 |   450 |
    |  2 | Steve     | Hope     |    0 |    29 |
    |  3 | Gary      | Flops    |    1 |     8 |
    +----+-----------+----------+------+-------+

我希望能够搜索lastName = Hope OR more = 1 我希望Bob Hope能够成为最佳人选,因为他匹配了两个要求的东西。我知道在这个例子中这将会发生什么,但这只是一个例子。

如果我查询; lastName = Hope OR firstName = Steve。史蒂夫应该位居榜首,然后是鲍勃

我希望这很容易理解。 有些人可以给我一个详细的解释说明。

3 个答案:

答案 0 :(得分:5)

这个怎么样:

SELECT
  id,
  firstName,
  lastName,
  more,
  stuff,
  (lastName = 'Hope') + (firstName = 'Steve') AS weight
FROM mytable
ORDER BY weight DESC;

结果:

+----+-----------+----------+------+-------+--------+
| id | firstName | lastName | more | stuff | weight |
+----+-----------+----------+------+-------+--------+
|  2 | Steve     | Hope     |    0 |    29 |      2 |
|  1 | Bob       | Hope     |    1 |   450 |      1 |
|  3 | Gary      | Flops    |    1 |     8 |      0 |
+----+-----------+----------+------+-------+--------+

答案 1 :(得分:1)

我能想到的最简单方法是使用MATCH() ... AGAINST。你可以按“得分”排序。

SELECT ID, firstName, LastName, stuff, more, MATCH(firstName,LastName,more,stuff) AGAINST ('words to search for'  IN BOOLEAN MODE) AS score
FROM yourTable 
WHERE MATCH(firstName,LastName,more,stuff) AGAINST ('words to search for'  IN BOOLEAN MODE)
ORDER BY score

问题在于没有全文索引会很慢,全文索引只能用于MyISAM引擎。

答案 2 :(得分:1)

除了Mike的好答案之外,还有另一种选择:

SELECT
    id,
    firstName,
    lastName,
    more,
    stuff,
    COUNT(m1.id) + COUNT(m2.id)
      AS weight
FROM
    mytable AS m

      LEFT JOIN
    mytable AS m1
        ON  m1.id = m.id
        AND m1.lastName = 'Hope'

      LEFT JOIN
    mytable AS m2
        ON  m2.id = m.id
        AND m2.firstName = 'Steve'  

GROUP BY m.id
HAVING COUNT(m1.id) + COUNT(m2.id) > 0    
ORDER BY weight DESC;

还有一个:

SELECT
    m.id,
    m.firstName,
    m.lastName,
    m.more,
    m.stuff,
    COUNT(*) AS weight
FROM
    mytable AS m
      JOIN
        ( SELECT id
          FROM mytable
          WHERE lastName = 'Hope'
        UNION ALL
          SELECT id
          FROM mytable
          WHERE firstName = 'Steve'  
        ) AS c
        ON c.id = m.id
GROUP BY m.id  
ORDER BY weight DESC;
相关问题