如何在多个自我联接上指定排序顺序

拉布德

我有一个像这样的属性表

CREATE TABLE attributes (
    attribute_id INT,
    product_id INT,
    random INT,
    UNIQUE KEY (attribute_id,random,product_id),
    KEY (product_id)
);

random是在插入项上为洗牌产品计算的随机整数(可以满足我的需求)。有一些自联接查询,例如

SELECT DISTINCT x.product_id
FROM attibutes x
INNER JOIN attributes y ON x.product_id=y.product_id
INNER JOIN attributes z ON x.product_id=z.product_id
WHERE x.attribute_id IN (20000085,20000090) AND
    y.attribute_id IN (10000007) AND
    z.attribute_id IN (30000050,30000040,30000012)
LIMIT 0,100;

如您所见,我想选择在每个数字范围内至少具有一个属性的产品。MySQL非常聪明,它会根据UNIQUE键的选择性为第一次查询选择表别名。正如预期的那样,由于randomUNIQUE键,结果按列顺序排序但是我如何建议MySQL恢复命令?添加ORDER BY x.random DESC时,MySQL可能会使用filesort进行排序,因为如果它对y基本查询使用表别名(由于属性ID 10000007的更好的选择性),则必须使用alias的UNIQUE键x问题是:我不知道MySQL会使用哪个别名(由查询优化器决定)。那么如何指定订单方向呢?

(我想指出该表包含约6000万行,因此在响应时间中是否使用filesort会很重要)

戈登·利诺夫(Gordon Linoff)

您可能会检查此版本是否更快:

SELECT a.product_id
FROM attibutes a
WHERE a.attribute_id IN (20000085, 20000090, 10000007, 30000050, 30000040, 30000012) 
GROUP BY a.product_id
HAVING SUM(a.attribute_id IN (20000085, 20000090) ) > 0 AND
       SUM(a.attribute_id IN (10000007) ) > 0 AND
       SUM(a.attribute_id IN (30000050, 30000040, 30000012) ) > 0
ORDER BY a.rand
LIMIT 0, 100;

的费用GROUP BY应与的大致相同SELECT DISTINCT您仍然会产生按随机数排序的开销,但是有时这种表述从性能角度来看是可行的。

编辑:

如果将随机数放在产品表中,则可能会执行以下操作:

select p.*
from products p
where exists (select 1 from attributes a where p.product_id = a.product_id and a.attribute_id IN (20000085, 20000090) ) and
      exists (select 1 from attributes a where p.product_id = a.product_id and a.attribute_id IN (10000007) ) and
      exists (select 1 from attributes a where p.product_id = a.product_id and a.attribute_id IN (30000050, 30000040, 30000012) )
order by p.rand
limit 5;

嗯,如果您将随机数存储在产品表中,则可以将join其输入查询中,并在中使用它order by那也许也行。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何在XDocument上使用LINQ进行自我联接?

来自分类Dev

如何在KDB查询中进行自我联接?

来自分类Dev

Access中的多个自我联接或联合

来自分类Dev

多个自我联接和空值

来自分类Dev

如何在同一行上建立联接和自我联接

来自分类Dev

SQL如何在自联接上查询

来自分类Dev

如何在联接上添加单引号?

来自分类Dev

如何将多个自我联接查询转换为递归CTE

来自分类Dev

如何在Java的ArrayList中为数据指定排序顺序?

来自分类Dev

如何在lambda表达式中放置内联条件联合/自我联接?

来自分类Dev

多个联接上的GROUP BY子句

来自分类Dev

如何在Propell中选择表联接上的特定列?

来自分类Dev

如何使用自我联接重塑熊猫中的重复行?

来自分类Dev

SQL Server自我联接等

来自分类Dev

如何在ArangoDB中使用自我Join访问集合中多个文档中的数据

来自分类Dev

如何在枚举中匹配自我?

来自分类Dev

如何在定义中引用自我?

来自分类Dev

在左联接到多个表之后如何在GROUP BY之前排序BY / MAX?

来自分类Dev

如何在每个超链接上指定不同的操作

来自分类Dev

如何在这里借用自我的多个部分?自我在这里不是一成不变的吗?

来自分类Dev

如何按照我在“ IN”条件中指定行ID的顺序来排序mysql结果

来自分类Dev

多个联接上相同的表

来自分类Dev

从多个重复字段中获取数据时,自我联接是否可以继续使用BigQuery?

来自分类Dev

Oracl SQL从多个自我联接中删除不相同的重复项

来自分类Dev

Mysql:创建具有多个自我联接的视图,结果中没有重复项

来自分类Dev

如何在 PySpark collect_list 中维护排序顺序并收集多个列表

来自分类Dev

我如何在mongodb中设置自我加入

来自分类Dev

我如何内部联接多个表?

来自分类Dev

Optaplanner+Drools - 我如何顺序排序

Related 相关文章

  1. 1

    如何在XDocument上使用LINQ进行自我联接?

  2. 2

    如何在KDB查询中进行自我联接?

  3. 3

    Access中的多个自我联接或联合

  4. 4

    多个自我联接和空值

  5. 5

    如何在同一行上建立联接和自我联接

  6. 6

    SQL如何在自联接上查询

  7. 7

    如何在联接上添加单引号?

  8. 8

    如何将多个自我联接查询转换为递归CTE

  9. 9

    如何在Java的ArrayList中为数据指定排序顺序?

  10. 10

    如何在lambda表达式中放置内联条件联合/自我联接?

  11. 11

    多个联接上的GROUP BY子句

  12. 12

    如何在Propell中选择表联接上的特定列?

  13. 13

    如何使用自我联接重塑熊猫中的重复行?

  14. 14

    SQL Server自我联接等

  15. 15

    如何在ArangoDB中使用自我Join访问集合中多个文档中的数据

  16. 16

    如何在枚举中匹配自我?

  17. 17

    如何在定义中引用自我?

  18. 18

    在左联接到多个表之后如何在GROUP BY之前排序BY / MAX?

  19. 19

    如何在每个超链接上指定不同的操作

  20. 20

    如何在这里借用自我的多个部分?自我在这里不是一成不变的吗?

  21. 21

    如何按照我在“ IN”条件中指定行ID的顺序来排序mysql结果

  22. 22

    多个联接上相同的表

  23. 23

    从多个重复字段中获取数据时,自我联接是否可以继续使用BigQuery?

  24. 24

    Oracl SQL从多个自我联接中删除不相同的重复项

  25. 25

    Mysql:创建具有多个自我联接的视图,结果中没有重复项

  26. 26

    如何在 PySpark collect_list 中维护排序顺序并收集多个列表

  27. 27

    我如何在mongodb中设置自我加入

  28. 28

    我如何内部联接多个表?

  29. 29

    Optaplanner+Drools - 我如何顺序排序

热门标签

归档