Сложная выборка из таблицы

Тема в разделе "Базы данных", создана пользователем gelous, 31 авг 2009.

Статус темы:
Закрыта.
Модераторы: latteo
  1. gelous

    gelous

    Регистр.:
    11 май 2007
    Сообщения:
    215
    Симпатии:
    11
    product_id category_id
    53 58
    53 61
    53 64
    53 71
    123 34
    123 36
    123 38
    128 58
    128 60
    128 64
    128 71
    152 1
    152 71

    Вот моя таблица. Мне нужны выбрать такие продукты, у которых есть category_id и 71 и 64. никак не получается. помогните плз ;-)
     
  2. antidote

    antidote

    Регистр.:
    21 янв 2008
    Сообщения:
    167
    Симпатии:
    42
    Код:
    SELECT T.product_id FROM Table AS T
    JOIN Table AS T1
    ON T1.product_id = T.product_id
    WHERE T.category_id = 71 AND T1.category_id = 64
    
     
    gelous нравится это.
  3. gelous

    gelous

    Регистр.:
    11 май 2007
    Сообщения:
    215
    Симпатии:
    11
    отлично, работает! сам начал делать с джоинами, но както не очень получилось. если катеогрии будет 3 делать по аналогии?
     
  4. antidote

    antidote

    Регистр.:
    21 янв 2008
    Сообщения:
    167
    Симпатии:
    42
    Да, но имхо легче в скрипте задать какое количество джойнов вам понадобится для создания запроса. Определяете сколько категорий надо учесть и столько же раз в запросе должно встретиться JOIN, ну и количество параметров WHERE должно соответствовать.
     
    _acid_ и gelous нравится это.
  5. juggernaut13

    juggernaut13 Постоялец

    Регистр.:
    23 авг 2009
    Сообщения:
    59
    Симпатии:
    16
    шото вы мудрите
    Код:
    SELECT * FROM product WHERE product.id IN ( SELECT product_id FROM Table WHERE category_id IN (71,64) )
    
     
  6. antidote

    antidote

    Регистр.:
    21 янв 2008
    Сообщения:
    167
    Симпатии:
    42
    Почему мудрим? Много где пишут, что зачастую JOIN эффективнее подзапросов, хотя бывают исключения. Лучший вариант может быть определен по результатам выполнения EXPLAIN.
    Что же касается запроса, то в условии было И 64 И 71. В запросе
    Код:
    SELECT product_id FROM Table WHERE category_id IN (71,64)
    
    же восзвращаются строки у которых может совпасть только один из параметров. Это повлечет за собой неверную выборку во внешнем запросе. Плюс во вложенном подзапросе следовало добавить бы DISTINCT.
     
    juggernaut13 нравится это.
  7. juggernaut13

    juggernaut13 Постоялец

    Регистр.:
    23 авг 2009
    Сообщения:
    59
    Симпатии:
    16
    да ты прав
    подзапросы mysql не так хорошо оптимизурует как join
    но если пишется апликуха которой будут пользоваться пару раз в день и объем данных невелик то можно забить болт

    написал на скорую руку
     
  8. Laba

    Laba Создатель

    Регистр.:
    27 сен 2009
    Сообщения:
    18
    Симпатии:
    2
    Можно ещё так

    SELECT product_id
    FROM Table
    group by product_id
    having SUM( IF( category_id=64 and category_id=71, 1, 0) ) = 2
     
  9. nabber

    nabber

    Регистр.:
    14 дек 2006
    Сообщения:
    162
    Симпатии:
    16
    а помогите и мне sql запрос составить пожайлксто

    задача такая
    вот к примеру запрос
    UPDATE `wp_posts` SET `post_content` = REPLACE(`post_content`, '<a href = "link1"> ', '');

    этот запрос удалит <a href = "link1">
    , а вот если мне надо удалить <a href = постоянно меняющийся текст> как сделать запрос???
     
  10. dohtar

    dohtar Писатель

    Регистр.:
    28 ноя 2008
    Сообщения:
    7
    Симпатии:
    1
    встречный вопрос: а как вы потом удалите закрывающие тэги </a> от только что удаленных вами открывающих?
    мне кажется проще вычитать такие посты в массив и пройтись по ним регуляркой
     
Статус темы:
Закрыта.