Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql:在一个表中选择4个条目,根据行内容选择唯一的2和2_Mysql - Fatal编程技术网

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;