За последние 24 часа нас посетили 20303 программиста и 1716 роботов. Сейчас ищут 1310 программистов ...

SELECT из двух таблиц и оператор LIKE

Тема в разделе "PHP и базы данных", создана пользователем Andrey K., 16 янв 2008.

  1. Andrey K.

    Andrey K. Активный пользователь

    С нами с:
    22 май 2007
    Сообщения:
    83
    Симпатии:
    0
    Привет.
    Есть две таблицы:
    1-product(id, name);
    1, пиво
    2, сигареты
    3, журналы

    2-customer(id, name, email, address, product, city)
    1, Вася, vacya@mail.ru, adres1, пиво | сигареты, Киев
    2, Петя, petya@mail.ru, adres2, пиво | журналы, Москва
    3, Коля, kolya@mail.ru, adres3, журналы, Киев

    Первая таблица содержит названия продуктов; вторая таблица описывает заказщика (имя, адрес и т.д.) плюс в колонке product записаны через разделитель (символ " | ") продукты, которые использует заказщик.

    Нужно выбрать всех заказщиков, которые используют один из продуктов, например журнал или пиво...
    Причем я из таблицы product получаю только id`шник продукта...
    Поскольку продукты пишутся в одно поле через символ-разделитель, то наверное нужно использовать оператор LIKE...
    Как построить запрос?
    SELECT customer.*, product.name
    FROM customer, product
    WHERE ..... вот тут-то мозгов и не хватает :(
    как вытащить по id`шнику название продукта и запихать его в LIKE?

    Код (Text):
    1.  
    2. SELECT customer.*, product.name
    3. FROM customer, product
    4. WHERE customer.product LIKE product.id=1
    такой запрос ничего не возвращает
     
  2. Dagdamor

    Dagdamor Активный пользователь

    С нами с:
    4 фев 2006
    Сообщения:
    2.095
    Симпатии:
    1
    Адрес:
    Барнаул
    Andrey K.
    WHERE POSITION(product.name, customer.product)

    POSITION() возвращает не ноль, если первая строка-аргумент содержится во второй.
    Но елки, как же это тормозить-то будет...
     
  3. Sergey89

    Sergey89 Активный пользователь

    С нами с:
    4 янв 2007
    Сообщения:
    4.796
    Симпатии:
    0
    А что мешает связи в отдельную таблицу перетащить?
     
  4. Andrey K.

    Andrey K. Активный пользователь

    С нами с:
    22 май 2007
    Сообщения:
    83
    Симпатии:
    0
    Dagdamor
    что-то не получается использовать POSITION, выдает ошибку:
    Код (Text):
    1.  
    2. SELECT *
    3. FROM customer
    4. WHERE POSITION( "пиво", product)
    5.  
    6. Ответ MySQL:  
    7. #1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ' product)' at line 3
    И в мануалах не могу найти синтаксис этого оператора, не подскажешь где найти описание POSITION`а?

    Нашел описание синтаксиса: POSITION (str IN fld)
     
  5. decoder

    decoder Активный пользователь

    С нами с:
    11 фев 2006
    Сообщения:
    469
    Симпатии:
    0
  6. Andrey K.

    Andrey K. Активный пользователь

    С нами с:
    22 май 2007
    Сообщения:
    83
    Симпатии:
    0
    с синтаксисом разобрались, теперь следующая непонятка:
    как в POSITION вставить зачение из другой таблицы?
    Код (Text):
    1.  
    2. SELECT customer. * , product.name
    3. FROM customer, product
    4. WHERE POSITION(product.id=3 IN customer.product)
    Такой запрос ничего не возвращает...
    можно ли выражение product.id=3 присвоить какой-либо переменной и потом подставить эту переменную в POSITION?
     
  7. Dagdamor

    Dagdamor Активный пользователь

    С нами с:
    4 фев 2006
    Сообщения:
    2.095
    Симпатии:
    1
    Адрес:
    Барнаул
    EDIT: Сорри, виноват.
     
  8. decoder

    decoder Активный пользователь

    С нами с:
    11 фев 2006
    Сообщения:
    469
    Симпатии:
    0
    Вроде так должно быть, если знаем, что конкретно ищем:
    [sql]
    SELECT customer. * , product.name
    FROM customer, product
    WHERE POSITION("журналы" IN customer.product)
    [/sql]
    Ну или так тож должно, когда только id:
    [sql]
    SELECT customer. * , product.name
    FROM customer, product
    WHERE POSITION(product.name IN customer.product) AND product.id=3;
    [/sql]
     
  9. armadillo

    armadillo Активный пользователь

    С нами с:
    6 апр 2007
    Сообщения:
    2.380
    Симпатии:
    0
    Адрес:
    Russia, Moscow
    Структура не годится.
    Первая таблица содержит названия продуктов; вторая таблица описывает заказщика (имя, адрес и т.д.) плюс в колонке product записаны через разделитель (символ " | ") продукты, которые использует заказщик.

    это надо делать один раз при добавлении записи и создавать отдельную таблицу связи многие ко многим
    product_id
    customer_id
     
  10. Andrey K.

    Andrey K. Активный пользователь

    С нами с:
    22 май 2007
    Сообщения:
    83
    Симпатии:
    0
    armadillo
    согласен, структура не продумана...
    но она уже такая есть, хотя задумываюсь над реструктизацией
     
  11. Andrey K.

    Andrey K. Активный пользователь

    С нами с:
    22 май 2007
    Сообщения:
    83
    Симпатии:
    0
    decoder
    Второй вариант работает и не очень медленно (пока)
    Спасибо