mysql-select record(如果可用),否则选择next或previous priority record

bsxbgnwa  于 2021-06-21  发布在  Mysql
关注(0)|答案(1)|浏览(316)

我有这个table结构
练习 ExercisesId | Name | PriorityWoman | PriorityMan | RefEquipment | MuscleBits 从这里我选择优先权明智的演习。我有1到9个优先级。
现在,我正在从表中选择某个优先级的数据,我想做的是假设如果6个优先级不可用,那么我想在表中选择下一个最低优先级(即优先级7/8/9)练习,或者如果下一个优先级不可用,则选择上一个最高优先级(即优先级5/4/3/2/1)练习。。。
这是我到目前为止所做的

SELECT Exercises.*,
       GymToEquipment.RefEquipment
FROM Exercises,
     GymToEquipment
WHERE GymToEquipment.RefGym = '29'
  AND GymToEquipment.RefEquipment = Exercises.RefEquipment
  AND (CASE
           WHEN Exercises.MuscleBits IN('Back hand',
                                        'Front hand',
                                        'Shoulders',
                                        'Back') THEN Exercises.PriorityWoman IN (1)
           WHEN Exercises.MuscleBits IN('Stomach') THEN Exercises.PriorityWoman IN (3)
           WHEN Exercises.MuscleBits IN('Chest') THEN Exercises.PriorityWoman IN (2)
           ELSE Exercises.PriorityWoman IN (7)
       END)

样本数据
创建表格练习(exerciseid int(11)not null,name varchar(255)collate utf8\u unicode\u ci not null,priorityman int(11)not null,prioritywoman int(11)not null,image text collate utf8\u unicode\u ci not null,refequipment int(11)default null,musclebits text collate utf8\u unicode\u ci not null);
插入
练习(exerciseid,name,priorityman,prioritywoman,image,refequipment,musclebits)值(2,'e1',1,3,'localhost/gyms/images/1525077944\u 5ae6d7b85dab8.png',4,'legs'),(3,'e2',2,6,'localhost/gyms/images/1525079863\u 5ae6df371e6b7.png',5,'legs'),(4,'e3',3,7,'localhost/gyms/images/1525079494\u 5ae6ddc68da4d.png',6,'legs'),(5,'e4',2,6,'localhost/gyms/images/1525079530 ae6ddea877cf.png',4,'legs'),(6,'e5',3,7,'localhost/gyms/images/1525079559 ae6de078149e.png',4,'legs'),(7,'e6',6,8,'localhost/gyms/images/1525079627 ae6de4b5cb8b.png',9,'legs'),(8,'e7',7,1,'localhost/gyms/images/1525079672 ae6de7894667.png',10,'legs'),(9,'e8',8,2,'localhost/gyms/images/1525079702_5ae6de96126bf.png',11,'legs'),(10,'e9',9,4,'localhost/gyms/images/1525079750_5ae6dec61ea58.png',12,'legs'),(11,'e10',10,5,'localhost/gyms/images/1525079779_5ae6dee33bda9.png',12,'legs'),(13,'e11',1,1,'localhost/gyms/images/1525081036_5ae6e3cc869df.png',14,'back'),(14,'e12',2,2,'localhost/gyms/images/1525081270 ae6e4b6bd066.png',31,'back'),(15,'e13',3,3,'localhost/gyms/images/1525081310 ae6e4dea9479.png',16,'back'),(16,'e14',4,4,'localhost/gyms/images/1525081375 ae6e51f06e44.png',17,'back'),(17,'e15',5,5,'localhost/gyms/images/1525081416 ae6e548dca82.png',14,'back'),(18,'e16',6,6,'localhost/gyms/images/1525081466\u 5ae6e57a839b7.png',14,'back'),(19,'e17',7,7,'localhost/gyms/images/1525081507\u 5ae6e5a3c4861.png',14,'back'),(20,'e19',8,8,'localhost/gyms/images/1525081532\u 5ae6e5bc8c703.png',14,'back'),(21,'e20',9,9,'localhost/gyms/images/1525081577\u 5ae6e5e5e9c7730.png',44,'back'),(22,'e21',10,10,'localhost/gyms/images/1525081618_5ae6e6125b122.png',44,'back'),(23,'e22',1,1,'localhost/gyms/images/1525081756_5ae6e69ce77cd.png',24,'chest'),(24,'e23',2,2,'localhost/gyms/images/1525081789_5ae6e6bd3d1fe.png',25,'chest'),(25,'e24',3,3,'localhost/gyms/images/15250813_5ae6e6d55e80c.png',25,'chest'),(26,'e25',4,4,'localhost/gyms/images/1525081854_5ae6e6fe10c7d.png',27,'chest'),(27,'26',5,5,'localhost/gyms/images/1525081905_5ae6e73158153.png',28,'chest'),(28,'27',6,6,'localhost/gyms/images/1525081927_5ae6e74752a0e.png',28,'chest'),(29,'28',1,2,'localhost/gyms/images/1525082103_5ae6e7f774930.png',30,'shoulders'),(30,'29',2,1,'localhost/gyms/images/1525082069 ae6e7d5382c6.png',31,'shoulders'),(31,'30',3,3,'localhost/gyms/images/1525082168 ae6e838e7091.png',32,'shoulders'),(32,'31',4,4,'localhost/gyms/images/1525082215 ae6e867a7600.png',32,'shoulders'),(33,'32',5,5,'localhost/gyms/images/1525082289 ae6e8b16dc8c.png',34,'shoulders'),(34,'33',1,1,'localhost/gyms/images/1525082321\u 5ae6e8d17cc8e.png',35,'gasty'),(35,'34',2,2,'localhost/gyms/images/1525082347\u 5ae6e8ebc1f03.png',36,'gasty'),(36,'35',3,3,'localhost/gyms/images/1525082367\u 5ae6e8ff6adb4.png',36,'gasty'),(37,'36',1,1,'localhost/gyms/images/1525082436\u 5ae6e94408290.png',40,'front hand'),(38,'37',2,2,'localhost/gyms/images/1525082460 ae6e95c6d067.png',38,'front hand'),(39,'38',3,3,'localhost/gyms/images/1525082483 ae6e9733a0b5.png',40,'front hand'),(40,'39',1,3,'localhost/gyms/images/1525082533 ae6e9a5a2b42.png',41,'back hand'),(41,'40',2,1,'localhost/gyms/images/1525082574 ae6e9cea82f3.png',42,'back hand');
编辑
有6种不同的肌肉,腿,胸,。。。等。我选择一组优先 3 假设 (Legs, Chest) 如果优先级3在中不可用 Legs 肌肉咬只然后选择另一个运动只为 Legs 肌肉咬
预期输出(稍后我将格式化数据,我只需要从表中提取练习)
{“days”:[{“daynumber”:0,“timeperiod”:0,“muscles”:[{“muscleid”:“legs”,“exercises”:[{“exerciseid”:“6”,“deviceid”:“4”,“exerciseset”:[{“setnumber”:1,“repetitions”:30,“weight”:56.55,“interval”:40},{“setnumber”:2,“repetitions”:30,“weight”:56.55,“interval”:40}},{“muscleid”:“back”,“exercises”:[{“exerciseid”:“15”,“deviceid”:“16”,“exerciseset”:[{“setnumber”:1,“repetitions”:30,“weight”:60.9,“interval”:40},{“setnumber”:2,“repetitions”:30,“weight”:60.9,“interval”:40}]},{“muscleid”:“胸部”,“exercises”:[{“exerciseid”:“25”,“deviceid”:“25”,“exerciseset”:[{“setnumber”:1,“repetitions”:30,“weight”:60.9,“interval”:40},{“setnumber”:2,“repetitions”:30,“weight”:60.9,“interval”:40}]},{“muscleid”:“肩部”,“exercises”:[{“exerciseid”:“31”,“deviceid”:“32”,“exerciseset”:[{“setnumber”:1,“repetitions”:30,“weight”:45.24,“interval”:40},{“setnumber”:2,“repetitions”:30,“weight”:45.24,“interval”:40}]},{“muscleid”:“胃”,“exercises”:[{“exerciseid”:“36”,“exerciseset”:[{“setnumber”:1,“repetitions”:30,“weight”:52.2,“interval”:40},{“setnumber”:2,“repetitions”:30,“weight”:52.2,“interval”:40}]},{“muscleid”:“front hand”,“exercises”:[{“exerciseid”:“39”,“deviceid”:“40”,“exerciseet”:[{“setnumber”:1,“repetitions”:30,“weight”:43.935,“interval”:40},{“setnumber”:2,“repetitions”:30,“weight”:43.935,“interval”:40}]}}

g6ll5ycj

g6ll5ycj1#

我真的不清楚你的数据是如何结合在一起的,因为你还没有包括任何GymtoeEquipment。例如,您可以使用union(如果存在,它将找到值,每个musclebit的下一个最高优先级和下一个最低优先级)和limit来获得适当的值

SET @LEGS = 3;SET @BACK = 7;

SELECT * FROM
(
SELECT 'LEG' AS EXCERCISE, S.* FROM
(
SELECT EXERCISEID,PRIORITYWOMAN FROM EXERCISES WHERE PRIORITYWOMAN = @LEGS AND MUSCLEBITS = 'LEGS' 
UNION 
SELECT EXERCISEID,PRIORITYWOMAN FROM EXERCISES 
    WHERE PRIORITYWOMAN  = (SELECT MIN(E1.PRIORITYWOMAN) FROM EXERCISES E1 WHERE E1.PRIORITYWOMAN > @LEGS AND MUSCLEBITS = 'LEGS' 
    LIMIT 1) 
UNION
SELECT EXERCISEID,PRIORITYWOMAN FROM EXERCISES 
 WHERE PRIORITYWOMAN  = (SELECT MAX(E1.PRIORITYWOMAN) FROM EXERCISES E1 WHERE E1.PRIORITYWOMAN < @LEGS AND MUSCLEBITS = 'LEGS' 
    ORDER BY PRIORITYWOMAN DESC LIMIT 1) 
UNION  
SELECT 9999,999 FROM DUAL
) S
LIMIT 1
) A
UNION
(SELECT * FROM
(
SELECT 'BACK' AS EXERCISE, S.* FROM
(
SELECT EXERCISEID,PRIORITYWOMAN FROM EXERCISES WHERE PRIORITYWOMAN = @BACK AND MUSCLEBITS = 'BACK' 
UNION 
SELECT EXERCISEID,PRIORITYWOMAN FROM EXERCISES 
    WHERE PRIORITYWOMAN  = (SELECT MIN(E1.PRIORITYWOMAN) FROM EXERCISES E1 WHERE E1.PRIORITYWOMAN > @BACK AND MUSCLEBITS = 'BACK' 
    LIMIT 1) 
UNION
SELECT EXERCISEID,PRIORITYWOMAN FROM EXERCISES 
 WHERE PRIORITYWOMAN  = (SELECT MAX(E1.PRIORITYWOMAN) FROM EXERCISES E1 WHERE E1.PRIORITYWOMAN < @BACK AND MUSCLEBITS = 'BACK' 
    ORDER BY PRIORITYWOMAN DESC LIMIT 1) 
UNION  
SELECT 9999,999 FROM DUAL
) S
LIMIT 1
) B
)

结果

+-----------+------------+---------------+
| EXCERCISE | EXERCISEID | PRIORITYWOMAN |
+-----------+------------+---------------+
| LEG       |          2 |             3 |
| BACK      |         19 |             7 |
+-----------+------------+---------------+
2 rows in set (0.04 sec)

是的,我知道这很可怕。

相关问题