Mysql в массиве выберите с определенным свойством для каждого элемента в массиве?

#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.