Mysql
 sql >> база данни >  >> RDS >> Mysql

Как да подредите и групирате MySQL резултати

Ето валиден резултат за по-прост проблем.

  • 1 сутрин, 1 следобед, 1 вечер и 1 нощна „смяна“
  • сума от 'ставката' <50
  • AA и BB (единствените възможни стойности) трябва да се появят по два пъти
      
    DROP TABLE IF EXISTS my_table;
    
    CREATE TABLE my_table
    (id SERIAL PRIMARY KEY
    ,code CHAR(2) NOT NULL
    ,shift VARCHAR(12) NOT NULL
    ,rate INT NOT NULL
    );
    
    INSERT INTO my_table VALUES
    ( 1 , 'AA' , 'Morning'   , 10),
    ( 2 , 'BB' , 'Afternoon' , 20),
    ( 3 , 'AA' , 'Evening'   , 13),
    ( 4 , 'BB' , 'Night'     , 18),
    ( 5 , 'BB' , 'Morning'   , 15),
    ( 6 , 'AA' , 'Afternoon' , 25),
    ( 7 , 'BB' , 'Evening'   , 15),
    ( 8 , 'AA' , 'Night'     , 22),
    ( 9 , 'AA' , 'Morning'   , 10),
    (10 , 'BB' , 'Afternoon' , 20),
    (11 , 'AA' , 'Evening'   , 13),
    (12 , 'AA' , 'Night'     , 18),
    (13 , 'BB' , 'Morning'   , 15),
    (14 , 'BB' , 'Afternoon' , 25),
    (15 , 'AA' , 'Evening'   , 15),
    (16 , 'BB' , 'Night'     , 22),
    (17 , 'AA' , 'Morning'   , 10),
    (18 , 'BB' , 'Afternoon' , 20),
    (19 , 'BB' , 'Evening'   , 13),
    (20 , 'AA' , 'Night'     , 18),
    (21 , 'AA' , 'Morning'   , 15),
    (22 , 'BB' , 'Afternoon' , 25),
    (23 , 'AA' , 'Evening'   , 15),
    (24 , 'BB' , 'Morning'   , 10),
    (25 , 'BB' , 'Afternoon' ,  2),
    (26 , 'AA' , 'Evening'   ,  8),
    (27 , 'BB' , 'Night'     ,  3),
    (28 , 'AA' , 'Morning'   ,  5),
    (29 , 'BB' , 'Afternoon' ,  2),
    (30 , 'AA' , 'Evening'   ,  1),
    (31 , 'BB' , 'Night'     ,  2),
    (32 , 'AA' , 'Night'     ,  2);
    
        SELECT * -- for simplicity. In reality, we would need to name and alias all columns for this result to be usable
          FROM my_table morning1
          JOIN my_table afternoon1
            ON afternoon1.id <> morning1.id 
          JOIN my_table evening1 
            ON evening1.id NOT IN(morning1.id,afternoon1.id) 
          JOIN my_table night1
            ON night1.id NOT IN(morning1.id,afternoon1.id,evening1.id) 
         WHERE morning1.shift = 'morning' 
           AND afternoon1.shift = 'afternoon' 
           AND evening1.shift = 'evening' 
           AND night1.shift = 'night' 
           AND morning1.rate + afternoon1.rate + evening1.rate + night1.rate < 50
           AND LENGTH(REPLACE(CONCAT(morning1.code,afternoon1.code,evening1.code,night1.code),'AA',''))=4
         ORDER
            BY RAND() LIMIT 1;
            
            +----+------+---------+------+----+------+-----------+------+----+------+---------+------+----+------+-------+------+
            | id | code | shift   | rate | id | code | shift     | rate | id | code | shift   | rate | id | code | shift | rate |
            +----+------+---------+------+----+------+-----------+------+----+------+---------+------+----+------+-------+------+
            |  1 | AA   | Morning |   10 | 25 | BB   | Afternoon |    2 | 15 | AA   | Evening |   15 | 27 | BB   | Night |    3 |
            +----+------+---------+------+----+------+-----------+------+----+------+---------+------+----+------+-------+------+

(Един от 721 валидни резултата)




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Свързване на БАЗА ДАННИ Грешка ТИП:2002:Разрешението е отказано

  2. Hibernate CriteriaBuilder, за да се присъедините към няколко таблици

  3. Как правилно да избегнете условията на Mysql Race

  4. Как да напиша mysql функция с динамично име на таблица?

  5. Мога ли да използвам повторно израз в MySQL заявка като променлива за друго поле?