Правила     Закладки     Карма    Календарь    Журналы    Помощь    Поиск    PDA    Чат   
        СМС-ки
   
Пейджер выключен!
 
Фильтр авторов:    показать 
  скрыть
  Ответ в темуСоздание новой темыСоздание опроса

> Оптимизирование запроса, Другие пути решения
Yoda  
 ۩  Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Пользователь
**

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 79
Пользователь №: 30866
На форуме: 4 года, 11 месяцев, 14 дней
Карма: 2




Представим условную таблицу


id | user_id | item_id | ans
------------------------------
1 | 1 | 5 | .....
------------------------------

2 | 1 | 2 | .....
------------------------------

3 | 2 | 3 | .....
------------------------------

4 | 2 | 4 | .....
------------------------------

5 | 3 | 2 | .....
------------------------------

6 | 4 | 2 | .....


Нужно выводить те поля, в которых для item_id засветился наш пользователь

Если я пользователь с id = 1, то из таблицы я имел дело с item_id = 5 и 2.
Следовательно, мне нужны поля под id = 1, 2, 5, 6.
С item_id = 3 и 4 пользователь пока не сталкивался, значит они ему не нужны

Самый простой вариант, это выбирать всё, а потом отсеивать в цикле по типу


SELECT id FROM ans WHERE user_id = $user_id AND item_id = $item_id LIMIT 1


Если id есть, значит пользователь сталкивался с этим итемом и работаем с строкой. Если id нет, значит пользователь не сталкивался с этим итемом и мы пропускаем данную строку и переходим к следующей

По-моему, мой вариант тяжеловат, потому что ожидается большое количество строк в данной таблице.
Как можно это ускорить?


--------------------
Идеальной защиты не существует...
PMПисьмо на e-mail пользователюСайт пользователя
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
FatCat  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Чеширский кот
******

Профиль
Журнал
Группа: Администратор
Почтальон группы
Сообщений: 5903
Пользователь №: 1
На форуме: 10 лет, 9 месяцев, 25 дней
Карма: 125

Не пью :
22 года, 2 месяца, 27 дней


ИМХО, 2 запроса.
Первый запрос собирает массив значений item_id для юзера; второй запрос соберет строки по всем нужным item_id.
Ну или с вложенным запросом:
SELECT * FROM table WHERE item_id IN
(
SELECT item_id FROM table WHERE user_id = 1
)


--------------------
Бесплатному сыру в дырки не заглядывают...
PMПисьмо на e-mail пользователюICQ
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
S.Chushkin  
Дата
Цитировать сообщение

Пользователь сейчас на форуме



Пофигист
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 777
Пользователь №: 36058
На форуме: 3 года, 11 месяцев, 7 дней
Карма: 40




Всё гораздо проще:
SELECT b.* 
FROM test02 a, test02 b
WHERE a.user_id = 1 and b.item_id = a.item_id


--------------------
PM
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
FatCat  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Чеширский кот
******

Профиль
Журнал
Группа: Администратор
Почтальон группы
Сообщений: 5903
Пользователь №: 1
На форуме: 10 лет, 9 месяцев, 25 дней
Карма: 125

Не пью :
22 года, 2 месяца, 27 дней


S.Chushkin
Красиво!


--------------------
Бесплатному сыру в дырки не заглядывают...
PMПисьмо на e-mail пользователюICQ
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
Valick  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 5491
Пользователь №: 35718
На форуме: 4 года, 14 дней
Карма: 167




Цитата (FatCat @ 3.02.2016 - 12:26)
Красиво!

нет не красиво, красиво (а главное правильно) использовать конструкцию JOIN ON


--------------------
wmr - R281553014107
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
S.Chushkin  
Дата
Цитировать сообщение

Пользователь сейчас на форуме



Пофигист
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 777
Пользователь №: 36058
На форуме: 3 года, 11 месяцев, 7 дней
Карма: 40




Цитата (Valick @ 3.02.2016 - 13:36)
нет не красиво, красиво (а главное правильно) использовать конструкцию JOIN ON

А я что написал?


--------------------
PM
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
  Быстрый ответ
Информация о Госте
Введите Ваше имя
Кнопки кодов
Для вставки цитаты, выделите нужный текст и
НАЖМИТЕ СЮДА
Введите сообщение
Смайлики
:huh:  :o  ;) 
:P  :D  :lol: 
B)  :rolleyes:  <_< 
:)  :angry:  :( 
:unsure:  :blink:  :ph34r: 
     
Показать всё

Опции сообщения  Включить смайлики?
 Включить подпись?
 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:

Опции темы Ответ в темуСоздание новой темыСоздание опроса