按WHERE IN(子查询)排序

4

我有一个这样的查询:

SELECT products.* FROM products
WHERE products.code = 'search word' OR products.id IN(SELECT product_names.product_id 
                     FROM product_names 
                     WHERE MATCH (product_names.name) 
                     AGAINST ('+search* +word*' IN BOOLEAN MODE) 
                     ORDER BY product_names.sorting_field)
ORDER BY ???

我希望主查询的顺序与 WHERE IN() 相同。但我似乎无法使用 FIELDFIND_IN_SET ,因为不知道从 MATCH AGAINST 中返回了什么。
我尝试了一些类似于 ORDER BY FIELD(products.id, product_names.product_id) 的方法,但是没能让它起作用。
实际上,我的查询语句更长、更复杂,这只是一个伪码版本。我不能在子查询之外执行 MATCH AGAINST

为什么你不能在子查询之外“*执行MATCH AGAINST*”? - eggyal
1个回答

3
SELECT   products.*
FROM     products LEFT JOIN (
  SELECT product_id, sorting_field
  FROM   product_names 
  WHERE  MATCH (product_names.name) AGAINST ('+search* +word*' IN BOOLEAN MODE) 
) t ON products.id = t.product_id
WHERE    products.code = 'search word' OR t.product_id IS NOT NULL
ORDER BY t.sorting_field

我尝试过这个方法,从某种意义上来说它非常有效。但是缺点是查询需要很长时间才能加载,因为每个产品都要进行一次匹配,而在第一次查询中只需进行一次匹配。 - sleepless_in_seattle
MySQL变量对我的查询有帮助吗? - sleepless_in_seattle
@unska:我不确定我理解了。MATCH ... AGAINST ...对于product_names中的每个记录仅评估一次(就像在您的原始查询中一样)。如果您有性能问题,请发布一个新问题,显示EXPLAIN <your query>的输出以及查询本身和引用的每个表的SHOW CREATE TABLE的输出。 - eggyal

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接