Mysql:在一个表中选择4个条目,根据行内容选择唯一的2和2
假设我有以下数据:Mysql:在一个表中选择4个条目,根据行内容选择唯一的2和2,mysql,Mysql,假设我有以下数据: ID Name Type 1 Uranus Planet 2 Neptune Planet 3 Earth Planet 4 Titan Moon 5 Callisto Moon 6 Io Moon 7 Moon Moon 8 Content NULL
ID Name Type
1 Uranus Planet
2 Neptune Planet
3 Earth Planet
4 Titan Moon
5 Callisto Moon
6 Io Moon
7 Moon Moon
8 Content NULL
9 Test Only one of this
总的来说,我总是需要4行随机首先选择两个相同的类型,然后选择两个其他相等的不一样。它不能选择NULL或只有一行的类型,如“仅此类型中的一行”
目前,我通过随机选择COUNT(x)>=2并在另一个select中使用此id(其他表中的数据类型可能不同,这就是为什么我使用id而不是类型的内容)来获取唯一行星的id
我没有只使用一个select的原因是每行都会运行子查询。这意味着,由于它是随机选择的,我可以在前两行中得到行星和月亮。
要选择剩下的两行,我会做相同的操作,并确保类型不同
如何对此进行优化?我一直在考虑加入工会,但我似乎无法让它发挥作用。我是否应该改为支持只运行一次的子查询的较新版本的MariaDB
示例响应
问题1:天王星(行星)、地球(行星)、木卫四(月亮)、木卫一(月亮)
问题2:月亮、土卫六、海王星、地球
查询3:海王星(行星)、天王星(行星)、木卫一(月亮)、土卫六(月亮)选择CONCAT(a.name,“(”,a.type,“)”)对象
,CONCAT(b.name,“(”,b.type,“)”)对象
,CONCAT(c.name,“(”,c.type,“)”)对象
,CONCAT(d.name,“(”,d.type,“)”)对象
来自太阳系a
加入太阳能系统b
关于b.id a.id
b型=a型
加入太阳系c
论c型b型
加入太阳系d
关于d.type=c.type
和c.id.d.id
命令
按兰德()极限4;
您的初始查询在哪里?我可以给您初始查询,但实际上是4个查询:1。选择前两行的id 2。使用id选择两行3。选择与第一个id内容4不同的其余两行的id。使用第二个id选择两行您需要提供示例:向我们显示4个查询的结果
。获取第一个id的示例查询:从类型不为NULL的行星中选择id按类型分组计数(x)>=2按兰德排序()限制1存在(4*3*2)*(3*2)=144个合法组合?它可以工作,但比我当前的解决方案慢10倍多。我可能有错误的索引吗?除此之外,我将select更改为限制1,因为我一次只需要4次,而不是4次。我不知道您当前的解决方案是什么(尽管如果2个查询比1快,我会非常惊讶)。也就是说,对于组合问题,使用(我的)SQL永远不会是一个好方法。也就是说,你只是在和4打交道!组合,应该不会太糟糕。我假设id是一个PK,在这种情况下,type
是唯一要索引的对象。该类型已经被索引为BTREE。现在使用这种方法需要10-20倍的时间,然后是我的初始设置。
SELECT CONCAT(a.name,'(',a.type,')') object_a
, CONCAT(b.name,'(',b.type,')') object_b
, CONCAT(c.name,'(',c.type,')') object_c
, CONCAT(d.name,'(',d.type,')') object_d
FROM solar_system a
JOIN solar_system b
ON b.id <> a.id
AND b.type = a.type
JOIN solar_system c
ON c.type <> b.type
JOIN solar_system d
ON d.type = c.type
AND c.id <> d.id
ORDER
BY RAND() LIMIT 4;