Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Помогите составить запрос к базе
|
|||
|---|---|---|---|
|
#18+
Добрый день. Есть база с данными о заказах и товарах в заказе. Задача - вывести емайл покупателя, который НЕ покупал определенный товар. INSERT INTO `order` (`order_id`, `email`) VALUES (1, 'mail1@domen.ru'), (2, 'mail2@domen.ru'); INSERT INTO `order_product` (`order_product_id`, `product_id`, `order_id`) VALUES (1, 1, 1), (2, 2, 1), (3, 3, 1), (4, 4, 2), (5, 5, 2), (6, 6, 2); Например, как найти email того, кто НЕ покупал товар с product_id = 5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.02.2017, 10:30 |
|
||
|
Помогите составить запрос к базе
|
|||
|---|---|---|---|
|
#18+
"В лоб" - через NOT EXISTS. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.02.2017, 10:32 |
|
||
|
Помогите составить запрос к базе
|
|||
|---|---|---|---|
|
#18+
С NOT EXISTS боюсь что при больших объемах базы, а эти таблицы часто имеют десятки тысяч строк, будет очень тяжело и не оптимально. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.02.2017, 10:56 |
|
||
|
Помогите составить запрос к базе
|
|||
|---|---|---|---|
|
#18+
deltamanС NOT EXISTS боюсь что при больших объемах базы, а эти таблицы часто имеют десятки тысяч строк, будет очень тяжело и не оптимально.При наличии правильного индекса все будет хорошо. И даже без него десятки тысяч записей - это весьма немного. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.02.2017, 11:07 |
|
||
|
Помогите составить запрос к базе
|
|||
|---|---|---|---|
|
#18+
Код: sql 1. 2. 3. 4. 5. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.02.2017, 11:46 |
|
||
|
Помогите составить запрос к базе
|
|||
|---|---|---|---|
|
#18+
Кажется то что надо, спасибо! Тогда, тот кто покупал, будет: Код: sql 1. правильно мыслю? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.02.2017, 12:32 |
|
||
|
Помогите составить запрос к базе
|
|||
|---|---|---|---|
|
#18+
Подскажите, пожалуйста, а если будет еще одна таблица: INSERT INTO `product_to_category` (`product_id`, `category_id`) VALUES (1, 1), (2, 2), (3, 2), (4, 1), (5, 1), (6, 2); Как выбрать тех кто не покупал продукты из category_id = 2 ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.02.2017, 14:20 |
|
||
|
Помогите составить запрос к базе
|
|||
|---|---|---|---|
|
#18+
deltamanправильно мыслю? Нет. INNER JOIN и без WHERE ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.02.2017, 14:58 |
|
||
|
Помогите составить запрос к базе
|
|||
|---|---|---|---|
|
#18+
Ок, спасибо, подправил. Для выборки того, кто покупал товары из категории 2 сделал так: Код: sql 1. 2. 3. 4. Вроде бы работает, правильно ли я составил запрос? А вот выбрать кто не покупал что-то пока не получается. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.02.2017, 16:48 |
|
||
|
Помогите составить запрос к базе
|
|||
|---|---|---|---|
|
#18+
deltaman, насчет фильтра p2c.category_id = '2' авторВ большинстве случаев не следует указывать в части ON какие бы то ни было условия, накладывающие ограничения на строки в наборе результатов (из этого правила есть исключения). Если необходимо указать, какие строки должны присутствовать в результате, следует сделать это в выражении WHERE. авторА вот выбрать кто не покупал что-то пока не получается. Принцип тот же, что и для 2х таблиц авторЕсли запись для правой таблицы в частях ON или USING в LEFT JOIN не найдена, то для данной таблицы используется строка, в которой все столбцы установлены в NULL. Эту возможность можно применять для нахождения результатов в таблице, не имеющей эквивалента в другой таблице: mysql> SELECT table1.* FROM table1 LEFT JOIN table2 ON table1.id=table2.id WHERE table2.id IS NULL; Этот пример находит все строки в таблице table1 с величиной id, которая не присутствует в таблице table2 (т.е. все строки в table1, для которых нет соответствующих строк в table2) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.02.2017, 05:57 |
|
||
|
Помогите составить запрос к базе
|
|||
|---|---|---|---|
|
#18+
Появился один нюанс с первым вариантом: Код: sql 1. 2. 3. 4. 5. Если в таблице будет еще заказ того же человека, но без товара product_id=5 в заказе, то он тоже выведется, а этого не хочется. То есть если имеем: INSERT INTO `order` (`order_id`, `email`) VALUES (1, 'mail1@domen.ru'), (2, 'mail2@domen.ru'), (3, 'mail2@domen.ru'); INSERT INTO `order_product` (`order_product_id`, `product_id`, `order_id`) VALUES (1, 1, 1), (2, 2, 1), (3, 3, 1), (4, 4, 2), (5, 5, 2), (6, 6, 2), (7, 1, 3), (8, 2, 3); Как быть в таком случае, как найти того, кто точно не покупал product_id=5 ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.02.2017, 10:45 |
|
||
|
Помогите составить запрос к базе
|
|||
|---|---|---|---|
|
#18+
У меня получились вот такие варианты: Код: sql 1. 2. 3. 4. Код: sql 1. 2. 3. 4. Склоняюсь к первому. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.02.2017, 11:39 |
|
||
|
Помогите составить запрос к базе
|
|||
|---|---|---|---|
|
#18+
Код: sql 1. 2. 3. 4. 5. 6. 7. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.02.2017, 14:36 |
|
||
|
Помогите составить запрос к базе
|
|||
|---|---|---|---|
|
#18+
Не знаком с тонкостями SQL, поэтому возникает вопрос, будет ли в варианте с NOT IN делаться этот под-запрос для каждого email? И как это скажется на производительности при 10к адресов? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.02.2017, 09:21 |
|
||
|
Помогите составить запрос к базе
|
|||
|---|---|---|---|
|
#18+
deltamanНе знаком с тонкостями SQL, поэтому возникает вопрос, будет ли в варианте с NOT IN делаться этот под-запрос для каждого email? И как это скажется на производительности при 10к адресов?Зависит от версии MySQL. В старых версиях, действительно, подзапрос выполнялся многократно. Начиная с версии 5.6 это поправили. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.02.2017, 13:38 |
|
||
|
Помогите составить запрос к базе
|
|||
|---|---|---|---|
|
#18+
авторНачиная с версии 5.6 это поправили. У клиентов может быть что угодно, поэтому опасаюсь пока применять. Допустимо ли использовать в этом случае мой вариант: Код: sql 1. 2. 3. 4. Или он совсем плох? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.02.2017, 14:54 |
|
||
|
Помогите составить запрос к базе
|
|||
|---|---|---|---|
|
#18+
deltaman, Код: sql 1. 2. 3. 4. 5. 6. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.02.2017, 11:30 |
|
||
|
Помогите составить запрос к базе
|
|||
|---|---|---|---|
|
#18+
Спасибо, но очень медленный, примерно в 7 раз медленнее моего варианта. (0.0008с/0.0059с) при (1к order и 17к order_product) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.02.2017, 15:16 |
|
||
|
Помогите составить запрос к базе
|
|||
|---|---|---|---|
|
#18+
deltaman, сомнительно как-то. А для измерения времени запрос сколько раз выполнили? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.02.2017, 07:32 |
|
||
|
|

start [/forum/topic.php?fid=47&msg=39402669&tid=1830914]: |
0ms |
get settings: |
10ms |
get forum list: |
13ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
51ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
50ms |
get tp. blocked users: |
1ms |
| others: | 15ms |
| total: | 160ms |

| 0 / 0 |
