我正在尝试创建一个应显示搜索建议的查询。 我执行的第一个查询是:
SELECT name, COUNT(*) AS occurrences
FROM shops
WHERE name LIKE '$queryString%'
GROUP BY name
ORDER BY occurrences DESC, name
LIMIT 5
此查询仅选择以搜索查询开头的名称。
例如搜索字词' wal'有以下结果:
如果上述查询的结果少于5,则应该进行额外的查询:
SELECT name, COUNT(*) AS occurrences
FROM shops
WHERE name LIKE '%$queryString%'
GROUP BY name
ORDER BY occurrences DESC, name
LIMIT 5
搜索结果' wal':
因此,如果第一个查询有5个或更多结果,它应该只显示第一个查询。如果结果少于5,则应显示两个查询的组合,如:
请注意,它应首先显示第一个查询的结果,然后再显示第二个查询的结果。我从不希望显示超过5个结果。
我想我需要以某种方式使用UNION功能,但无法使其正常工作。
答案 0 :(得分:0)
最好的方法是在存储过程中携带UNION。为:
答案 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;
如果您希望将事件考虑在内,使用连接可能是更好的方法。
请注意,这是将变量插入查询的不安全方式。您应该使用预准备语句并在查询上执行变量。