Mysql сортировка результатов по 2 столбцам из разных таблиц - PullRequest
1 голос
/ 28 января 2020

У меня есть 2 таблицы со следующей структурой

Products

id | name      | created_at          |
 1 | Produt1   | 2019-11-01 19:05:56 |
 2 | Product 2 | 2020-01-28 19:05:56 |
 3 | Product 3 | 2020-01-26 19:05:56 |

Draws

id | product_id |draw_number | created_at          |
 1 |          1 |          1 | 2020-01-28 19:05:56 | 
 2 |          1 |          2 | 2020-01-27 19:05:56 |

Сценарий состоит в том, что у нас есть 3 продукта в таблице продуктов, а для продукта 1 у нас есть 2 записи в таблице dr aws.

Я ищу запрос, который выбирает данные из таблицы продуктов и данные должны быть упорядочены по

  1. Если существует dr aws create_at, то порядок по ничьей, созданной в
  2. Если нет dr aws, сортировать по созданной в таблице продуктов.

Результат вывода должен быть таким

id | name      | created_at          |
 1 | Produt1   | 2019-01-28 19:05:56 | //created_at of draws of latest draw for this product
 2 | Product 2 | 2020-01-28 19:05:56 |
 3 | Product 3 | 2020-01-26 19:05:56 |

Как выбрать ожидаемые данные? ТИА

Ответы [ 2 ]

0 голосов
/ 28 января 2020

Это даст вам желаемый результат

CREATE TABLE Draws
    (`id` int, `product_id` int, `draw_number` int, `created_at` datetime)
;

INSERT INTO Draws
    (`id`, `product_id`, `draw_number`, `created_at`)
VALUES
    (1, 1, 1, '2020-01-28 19:05:56'),
    (2, 1, 2, '2020-01-27 19:05:56')
;
✓

✓
CREATE TABLE Products
    (`id` int, `name` varchar(9), `created_at` datetime)
;

INSERT INTO Products
    (`id`, `name`, `created_at`)
VALUES
    (1, 'Produt1', '2019-11-01 19:05:56'),
    (2, 'Product 2', '2020-01-28 19:05:56'),
    (3, 'Product 3', '2020-01-26 19:05:56')
;
✓

✓
SELECT p.id,p.name,MAX( IFNULL(d.`created_at` , p.`created_at`))
FROM Draws d RIGHT JOIN Products p 
ON d.product_id = p.id
GROUP BY p.id,p.name
ORDER BY p.id;
id | name      | MAX( IFNULL(d.`created_at` , p.`created_at`))
-: | :-------- | :--------------------------------------------
 1 | Produt1   | 2020-01-28 19:05:56                          
 2 | Product 2 | 2020-01-28 19:05:56                          
 3 | Product 3 | 2020-01-26 19:05:56                          

дБ <> скрипка здесь

0 голосов
/ 28 января 2020

Тест

SELECT t1.*
FROM Products t1
LEFT JOIN ( SELECT t2.product_id,
                   MAX(t2.created_at) created_at 
            FROM Draws t2
            GROUP BY product_id ) t3 ON t1.id = t3.product_id
ORDER BY GREATEST(t1.created_at, t3.created_at) DESC
...