Предположим, что у меня есть одна таблица mySQL (пользователи) со следующими полями:
userid
gender
region
age
ethnicity
income
Я хочу иметь возможность возвращать число полных записей на основе числа, которое вводит пользователь. Кроме того, они также будут предоставлять дополнительные критерии.
В простейшем примере они могут запросить 1000 записей, в которых 600 записей должны иметь пол = "Мужской" и 400 записей, где gender = "Female". Это достаточно просто сделать.
Теперь сделайте еще один шаг. Предположим, что теперь они хотят указать Region:
GENDER
Male: 600 records
Female: 400 records
REGION
North: 100 records
South: 200 records
East: 300 records
West: 400 records
Опять же, нужно вернуть только 1000 записей, но в итоге должно быть 600 мужчин, 400 женщин, 100 северян, 200 южан, 300 восточных жителей и 400 жителей Запада.
Я знаю, что это недопустимый синтаксис, но с использованием псевдо-mySQL-кода он, надеюсь, иллюстрирует то, что я пытаюсь сделать:
(SELECT * FROM users WHERE gender = 'Male' LIMIT 600
UNION
SELECT * FROM users WHERE gender = 'Female' LIMIT 400)
INTERSECT
(SELECT * FROM users WHERE region = 'North' LIMIT 100
UNION
SELECT * FROM users WHERE region = 'South' LIMIT 200
UNION
SELECT * FROM users WHERE region = 'East' LIMIT 300
UNION
SELECT * FROM users WHERE region = 'West' LIMIT 400)
Обратите внимание, что я не ищу одноразовый запрос. Общее количество записей и количество записей в каждом критерии будут постоянно меняться на основе ввода пользователем. Итак, я пытаюсь придумать общее решение, которое можно повторно использовать снова и снова, а не жестко закодированное решение.
Чтобы усложнить ситуацию, добавьте еще больше критериев. Также могут быть возраст, этническая принадлежность и доход, каждый со своим собственным количеством записей для каждой группы, дополнительный код, добавленный выше:
INTERSECT
(SELECT * FROM users WHERE age >= 18 and age <= 24 LIMIT 300
UNION
SELECT * FROM users WHERE age >= 25 and age <= 36 LIMIT 200
UNION
SELECT * FROM users WHERE age >= 37 and age <= 54 LIMIT 200
UNION
SELECT * FROM users WHERE age >= 55 LIMIT 300)
INTERSECT
etc.
Я не уверен, что это возможно для записи в одном запросе или для этого требуется несколько операторов и итераций.