#mysql
Вопрос:
Я пытаюсь оптимизировать свой код и не могу понять, является ли то, что я пытаюсь, жизнеспособным подходом, или мне следует проверить что-то еще, и я надеюсь, что вы могли бы мне немного помочь.
Так что в основном у меня есть выбор Mysql, который похож на этот:
SELECT COUNT(*) as book_orders
FROM book_sales
WHERE book_number = ?
AND purchase_date > ? (timestamp)
У меня есть список с номерами книг и соответствующими номерами и прямо сейчас,
Я отправляю выбор для каждого номера, что кажется ненужным, потому
что теоретически можно создать список и сделать со всеми из них 1 выбор.
SELECT COUNT(*)
FROM book_sales
WHERE book_number IN (1,2,3,4)
AND purchase_date > ?
GROUP BY book_number
С набором даты покупки он отфильтрует все продажи книг в соответствии с датой покупки, но я хотел бы отфильтровать каждый элемент в списке до определенной даты, как это:
book_number => 1 purchase_date => 1412
book_number => 2 purchase_date => 1621
book_number => 3 purchase_date => 1014
book_number => 4 purchase_date => 1978
Я попробовал подзапрос, подобный показанному, но он слишком низкий и не может обрабатывать много данных
SELECT * FROM
(SELECT * FROM book_sales WHERE book_number = 1 AND purchase_date > 1412) AS bk1,
....
...
Комментарии:
1. Пожалуйста , предоставьте таблицу «Показать создание», некоторые данные для вставки и ожидаемый результат
2. Вы можете использовать отдельные пары условий в сочетании с ИЛИ
WHERE (book_number = 1 AND purchase_date > 1412) OR (book_number = 2 AND purchase_date > 1621) OR ...
. В качестве альтернативы вы можете сохранить пары критериев в temptable и объединить их с помощью соответствующего выражения.
Ответ №1:
Сохраните пары критериев в заманчивые и присоединяйтесь к ним:
CREATE TEMPORARY TABLE tmp ( book_number INT
, purchase_date INT
-- define PK only if the amount of pairs is over 10 - it can improve
-- , PRIMARY KEY (book_number, purchase_date)
) ENGINE = Memory
SELECT 1 book_number, 1412 purchase_date UNION ALL
SELECT 2, 1621
SELECT 3, 1014
SELECT 4, 1978;
и затем
SELECT COUNT(*)
FROM book_sales
JOIN tmp ON book_sales.book_number = tmp.book_number
AND book_sales.purchase_date > tmp.purchase_date;
Или сделайте то же самое с помощью CTE, если позволяет версия MySQL.