ФорумПрограммированиеPHP для идиотов → mysql как сделать выборку если условие - массив

mysql как сделать выборку если условие - массив

  • soul

    Сообщения: 790 Репутация: N Группа: Кто попало

    Spritz Март 26, 2010, 11:23 д.п.

    Сейчас объясню. Пример ситуации: интернет магазин, корзина. Из сессий взяли массив добавленных в корзину id'ов товаров, теперь нужно одним запросом получить информацию о каждом из товаров, чтобы в корзине показать их. значит задача наша - объединить все эти id'ы в одном запросе. Раньше я делал так -
    select * from table where id= 1 or id = 2 or id =3
    и так пока не кончатся все товары.
    а можно это как то сделать проще и по умному?
    не знаю даже как написать вопрос чтобы погуглить
  • NRG

    Сообщения: 4761 Репутация: N Группа: в ухо

    Spritz Март 26, 2010, 11:56 д.п., спустя 32 минуты 51 секунду

    WHERE id IN(1,2,3,4)
  • adw0rd

    Сообщения: 22959 Репутация: N Группа: в ухо

    Spritz Март 26, 2010, 12:09 п.п., спустя 12 минут 41 секунду

    еще BETWEEN погугли
    https://smappi.org/ - платформа по созданию API на все случаи жизни
  • Givi

    Сообщения: 2284 Репутация: N Группа: Адекваты

    Spritz Март 26, 2010, 1:05 п.п., спустя 56 минут 8 секунд

    adw0rd, в его случае битвин все же менее удобен чем вариант от НеРЖе.
  • adw0rd

    Сообщения: 22959 Репутация: N Группа: в ухо

    Spritz Март 26, 2010, 1:11 п.п., спустя 6 минут 17 секунд

    Givi, поэтому я и сказал "еще"
    https://smappi.org/ - платформа по созданию API на все случаи жизни
  • phpdude

    Сообщения: 26646 Репутация: N Группа: в ухо

    Spritz Март 26, 2010, 2:32 п.п., спустя 1 час 20 минут 53 секунды


    Сейчас объясню. Пример ситуации: интернет магазин, корзина. Из сессий взяли массив добавленных в корзину id'ов товаров, теперь нужно одним запросом получить информацию о каждом из товаров, чтобы в корзине показать их. значит задача наша - объединить все эти id'ы в одном запросе. Раньше я делал так -
    select * from table where id= 1 or id = 2 or id =3
    и так пока не кончатся все товары.
    а можно это как то сделать проще и по умному?
    не знаю даже как написать вопрос чтобы погуглить
    раньше я молился за твой сервер
    Сапожник без сапог
  • adw0rd

    Сообщения: 22959 Репутация: N Группа: в ухо

    Spritz Март 26, 2010, 2:33 п.п., спустя 1 минуту 20 секунд

    phpdude, я думаю оптимизатор запросов за него тоже молился
    https://smappi.org/ - платформа по созданию API на все случаи жизни
  • phpdude

    Сообщения: 26646 Репутация: N Группа: в ухо

    Spritz Март 26, 2010, 2:36 п.п., спустя 2 минуты 34 секунды


    phpdude, я думаю оптимизатор запросов за него тоже молился
    мы кстати вроде это тестировали (кто ни тьпомнит? вопрос поднимался 100 пудов, к чему пришли не помню) .. и мне кажется что ниухя он не молился )))

    хотя может я ошибаюсь, но обыно OR создает фул скан
    Спустя 17 сек.
    его лучше не юзать, а юзать union select
    Сапожник без сапог
  • Nyaah

    Сообщения: 574 Репутация: N Группа: Джедаи

    Spritz Март 26, 2010, 6:38 п.п., спустя 4 часа 2 минуты 37 секунд

    дак IN(x, …) кажись не юзает индекс, OR мб лудше?
    Work, buy, consume, die
  • sobol

    Сообщения: 12 Репутация: N Группа: Кто попало

    Spritz Март 26, 2010, 6:42 п.п., спустя 3 минуты 37 секунд

    … IN (" . implode(',', $myArray) . ") …
  • adw0rd

    Сообщения: 22959 Репутация: N Группа: в ухо

    Spritz Март 26, 2010, 6:46 п.п., спустя 4 минуты 8 секунд


    mysql> explain select id from test where id = 201641 or id = 201642 or id = 201199;
    +—-+————-+———–+——-+—————+———+———+——+——+————————–+
    | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
    +—-+————-+———–+——-+—————+———+———+——+——+————————–+
    | 1 | SIMPLE | customers | range | PRIMARY | PRIMARY | 4 | NULL | 3 | Using where; Using index |
    +—-+————-+———–+——-+—————+———+———+——+——+————————–+
    1 row in set (0.00 sec)



    mysql> explain select id from test where id in (201641, 201642, 201199);
    +—-+————-+———–+——-+—————+———+———+——+——+————————–+
    | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
    +—-+————-+———–+——-+—————+———+———+——+——+————————–+
    | 1 | SIMPLE | customers | range | PRIMARY | PRIMARY | 4 | NULL | 3 | Using where; Using index |
    +—-+————-+———–+——-+—————+———+———+——+——+————————–+
    1 row in set (0.00 sec)

    https://smappi.org/ - платформа по созданию API на все случаи жизни
  • Nyaah

    Сообщения: 574 Репутация: N Группа: Джедаи

    Spritz Март 26, 2010, 6:53 п.п., спустя 6 минут 41 секунду

    угу, уже сам посмотрел, что эксплейн выдаёт одинаковый результат =)
    Work, buy, consume, die
  • NRG

    Сообщения: 4761 Репутация: N Группа: в ухо

    Spritz Март 26, 2010, 6:54 п.п., спустя 47 секунд


    дак IN(x, …) кажись не юзает индекс
    юзает
    Спустя 40 сек.
    о, пока отвечал, уже сделали тесты))
  • artoodetoo

    Сообщения: 5147 Репутация: N Группа: в ухо

    Spritz Март 26, 2010, 7:03 п.п., спустя 9 минут 4 секунды

    вопрос поднимался. похоже поведение mysql отличается от поведения других серверов. в лучшую сторону
    ιιlllιlllι унц-унц
  • phpdude

    Сообщения: 26646 Репутация: N Группа: в ухо

    Spritz Март 26, 2010, 7:31 п.п., спустя 28 минут 4 секунды

    а посложнее тестик? не примари + другие поля на пример, и индекс не обычный а по двум полям например, я помню эту фишку из ситуации когда он сука отказался жрать индексы, иначе бы я это не помнил :)

    я на хабре с чуваком в личке перетирали
    Сапожник без сапог

Пожалуйста, авторизуйтесь, чтобы написать комментарий!