【发布时间】:2017-04-28 14:14:14
【问题描述】:
我正在尝试根据搜索者的输入进行查询以从我的数据库中获取产品。假设在搜索器上输入的单词是“堆栈溢出”。
查询如下:
SELECT * FROM
(SELECT * FROM products t1
INNER JOIN products_references t2 ON t1.id = t2.id
INNER JOIN products_photo t3 ON t2.id = t3.id
WHERE
(t2.name LIKE '%stack%' COLLATE UTF8_UNICODE_CI
OR t3.photo_name LIKE '%stack%' COLLATE UTF8_UNICODE_CI
)
AND
(
t2.name LIKE '%overflow%' COLLATE UTF8_UNICODE_CI
OR t3.photo_name LIKE '%overflow%' COLLATE UTF8_UNICODE_CI
)
ORDER BY
CASE WHEN (t2.name LIKE '%stack%') THEN 0 ELSE 1 END,
CASE WHEN (t3.photo_name LIKE '%stack%' OR t3.photo_name LIKE '%overflow%' ) THEN 0 ELSE 1 END
) as a
UNION DISTINCT
SELECT * FROM
(SELECT * FROM products t1
INNER JOIN products_references t2 ON t1.id = t2.id
INNER JOIN products_photo t3 ON t2.id = t3.id
WHERE
(t2.name LIKE '%stack%' COLLATE UTF8_UNICODE_CI
OR t3.photo_name LIKE '%stack%' COLLATE UTF8_UNICODE_CI
)
ORDER BY
CASE WHEN (t2.name LIKE '%stack%' ) THEN 0 ELSE 1 END,
CASE WHEN (t3.photo_name LIKE '%stack%' ) THEN 0 ELSE 1 END
) as b LIMIT 0,10
我要归档的内容:
- 获取第一个查询的结果,然后是第二个查询的结果,按每个查询的自身规则排序。
- 删除已经出现在第一个查询中的重复行。
例子:
表 A 结果
- mysql 堆栈溢出
- jquery 堆栈溢出
表 B 结果
- 堆叠一些东西
- jquery 堆栈溢出
- 全部堆叠
最终结果
- mysql 堆栈溢出
- jquery 堆栈溢出
- 堆栈溢出一些东西
- 全部堆叠
我现在得到的结果是没有按我想要的顺序排列。有什么想法吗?
编辑
我已经尝试过 spencer7593 解决方案:
SELECT *
FROM products t1
JOIN products_references t2 ON t1.id = t2.id
JOIN products_photo t3 ON t2.id = t3.id
WHERE t2.name LIKE '%stack%' COLLATE UTF8_UNICODE_CI
OR t3.photo_name LIKE '%stack%' COLLATE UTF8_UNICODE_CI
ORDER
BY CASE WHEN (t2.name LIKE '%stack%' ) THEN 0 ELSE 1 END,
CASE WHEN (t3.photo_name LIKE '%stack%' OR t3.photo_name LIKE '%overflow%' ) THEN 0 ELSE 1 END,
CASE WHEN (t3.photo_name LIKE '%stack%' ) THEN 0 ELSE 1 END
这里的主要问题是两个查询首先按第一个单词排序(上面示例中的 '%stack%' )。由于第一个查询在某种程度上是第二个查询的子集,因此将所有查询放在一起会改变顺序。如何加入这两个查询以保持与单个查询相同的顺序?
【问题讨论】:
-
如果两个都存在结果,在B记录之前显示A记录?由于外部选择没有排序,因此可以按引擎所需的任何顺序返回结果。子查询的排序仅在您使用限制时才重要。这似乎不是这里的情况,所以它们除了减慢结果之外没有任何作用。要获得所需的结果,您必须订购外部查询。
-
是的。我会尝试更好地解释它。我想先显示 A 的记录,然后再显示所有 B 记录。如果 A 上存在记录,我不想再次显示它们。我确实对外部查询使用了限制,这有关系吗?
标签: mysql sql-order-by union