联盟2查询最多显示5个搜索建议

时间:2014-04-16 12:09:50

标签: php mysql union

我正在尝试创建一个应显示搜索建议的查询。 我执行的第一个查询是:

SELECT name, COUNT(*) AS occurrences
    FROM shops
    WHERE name LIKE '$queryString%'
    GROUP BY name
    ORDER BY occurrences DESC, name
    LIMIT 5

此查询仅选择以搜索查询开头的名称。

例如搜索字词' wal'有以下结果:

  • Wal mart
  • Wal 商店
  • Wal ablala
  • Wal lpaper商店
  • ...

如果上述查询的结果少于5,则应该进行额外的查询:

SELECT name, COUNT(*) AS occurrences
    FROM shops
    WHERE name LIKE '%$queryString%'
    GROUP BY name
    ORDER BY occurrences DESC, name
    LIMIT 5

搜索结果' wal':

  • wal ls
  • 购物 wal l
  • ...

因此,如果第一个查询有5个或更多结果,它应该只显示第一个查询。如果结果少于5,则应显示两个查询的组合,如:

  • Wal mart
  • Wal 商店
  • Wal ablala
  • Wal lpaper商店
  • wal ls
  • 购物 wal l
  • ...

请注意,它应首先显示第一个查询的结果,然后再显示第二个查询的结果。我从不希望显示超过5个结果。

我想我需要以某种方式使用UNION功能,但无法使其正常工作。

2 个答案:

答案 0 :(得分:0)

最好的方法是在存储过程中携带UNION。为:

UNION inside IF EXISTS statement not working

答案 1 :(得分:0)

您可以计算上一次选择的行数,并相应地限制第二次选择。然后,您可以限制所需的总结果。

SELECT * FROM 
(
    SELECT name FROM shops WHERE name like '$queryString%'
    UNION
    SELECT * FROM (SELECT name FROM shops WHERE name LIKE '%$queryString%')
    LIMIT
    (5 - 
        (SELECT COUNT(*) FROM (SELECT name FROM shops WHERE name like '$queryString%'))
    )
) LIMIT 5;

如果您希望将事件考虑在内,使用连接可能是更好的方法。

请注意,这是将变量插入查询的不安全方式。您应该使用预准备语句并在查询上执行变量。