Имя: Пароль:
IT
Админ
Помогите с простым запросом
0 DirecTwiX
 
27.03.13
01:09
Таблица
user item

У одного юзера несколько итемов.

Вот запрос для получения пользователей с итемом 13 (выполняется доли секунды):

       SELECT DISTINCT
           user
       FROM
           owners
       WHERE item = 13

Нужен запрос для получения первых N юзеров, у которых нет итема 13.
Осложняется всё тем, что в базе 20млн строк.

Пробовал:
1) левое соединение с той же таблицей по юзеру (on a.u = b.u and b.i = 13), а дальше WHERE b.u is NULL
2) Where u NOT IN (запрос выше)
3) Пока самое оптимальное, что придумал это выбрать первые N + M юзеров и левым соединением отбросить M. Тут М - это количество юзеров, у которых есть итем 13. Но такое удовольсвие не очень устраивает, т.к. база растёт, и выбирать N+M элементов становиться всё труднее
1 DirecTwiX
 
27.03.13
01:12
А поражает меня время выполнения первого способа. Нет бы соединять пока не превысим лимит (LIMIT N), но надо сначала сджойнить 20млн строк, а только потом взять лимит..
2 1Сергей
 
27.03.13
07:54
SELECT FIRST 20
           user
       FROM
           owners
       WHERE item <> 13
3 Wobland
 
27.03.13
07:55
(2) таблица:
юзер1 - 12
юзер1 -13
твой запрос выдаст юзера1. а автору этого не надо. если я правильно понял, конечнл
4 Wobland
 
27.03.13
07:57
нот ин (селект), по-моему, самое то
5 DirecTwiX
 
27.03.13
13:30
(4) Да, запрос выглядит нормально, но выполняется 100+ секунд..
Как заставить работать лимит сразу?)
6 Злой Бобр
 
27.03.13
20:37
(0) TOP N
9 Fragster
 
гуру
27.03.13
20:41
SELECT DISTINCT ... WHERE поле NOT IN (...) LIMIT
10 Fragster
 
гуру
27.03.13
20:43
11 magicSan
 
27.03.13
20:43
(3) во вложеном групировать
12 Fragster
 
гуру
27.03.13
20:44
ORDER BY первичный ключ
13 magicSan
 
27.03.13
20:49
(0) самый дельный совет сделать вторую таблицу в которой уже отобранные данные которые меняются при корректировки первой таблицы
14 DirecTwiX
 
27.03.13
20:57
(6) Это и есть LIMIT в MySQL
(11) Что группировать?
(12) 130 секунд. А внутренний за 10 первый раз выполняется.. В статье написано, что DISTINCT должно быть достаточно.
За статью спасибо - пригодится
(13) Что в таблице? Если правильно понимаю, то её размер будет count(user)*count(item) - дорогое удовольствие, которое производительность грохнет ещё..