За последние 24 часа нас посетили 17840 программистов и 1648 роботов. Сейчас ищут 868 программистов ...

Помогите с запросом

Тема в разделе "MySQL", создана пользователем inline, 21 мар 2011.

  1. inline

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

    С нами с:
    21 май 2010
    Сообщения:
    466
    Симпатии:
    0
    Есть таблица
    Есть запросы
    [sql]select id from table where id=3 or id=2
    select id from table where id=3 or id=1
    select id from table where id=3 or id=5
    [/sql]

    Нужно запросом выбрать общий результат (id, который есть во всех трех выборках)
    Результат id=3

    Нужно что-то типа
    1. делаю выборку по каждому запросу
    2. запоминаю результат выборки
    3. сравниваю результаты на факт пересечения

    Как все это сделать средствами мускула?
     
  2. Gromo

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

    С нами с:
    24 май 2010
    Сообщения:
    2.786
    Симпатии:
    2
    Адрес:
    Ташкент
    и откуда берутся запросы?
     
  3. inline

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

    С нами с:
    21 май 2010
    Сообщения:
    466
    Симпатии:
    0
    формируются php скриптом
     
  4. Gromo

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

    С нами с:
    24 май 2010
    Сообщения:
    2.786
    Симпатии:
    2
    Адрес:
    Ташкент
    SELECT id FROM table WHERE id IN (3,2) AND id IN (3,1) AND id IN (3,5)
    должно быть то, что нужно
     
  5. inline

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

    С нами с:
    21 май 2010
    Сообщения:
    466
    Симпатии:
    0
    еще такой вопрос, чтобы не плодить темы
    select @result:=id from table
    сколько будет жить переменная @result и как ее убить принудительно?
     
  6. inline

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

    С нами с:
    21 май 2010
    Сообщения:
    466
    Симпатии:
    0
    счас так и делаю
    но IN получается по селекту и в результате тормоза
    попробовал селекты в которые смотрю IN-ом записать в переменую, чтобы дергать только один раз
    тормоза менше, но есть (выполнение запроса до 3 сек.)
     
  7. inline

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

    С нами с:
    21 май 2010
    Сообщения:
    466
    Симпатии:
    0
    было 15-20 сек.
     
  8. Gromo

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

    С нами с:
    24 май 2010
    Сообщения:
    2.786
    Симпатии:
    2
    Адрес:
    Ташкент
    inline
    насколько я знаю, будет жить пока генерируется страница, т.е. это сессионая переменная.
    как только апач автоматом или сам вручную закроешь соединение с бд, переменная умрёт

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


    обнулять нет смысла. можешь присваивать нулл.

    в принципе, мог бы и сам проверить - это занимает всего 10 минут
     
  9. MiksIr

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

    С нами с:
    29 ноя 2006
    Сообщения:
    2.339
    Симпатии:
    44
    Задачу нормально поставь, а то "что-то откуда-то беру и непонятно что хочу"
     
  10. inline

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

    С нами с:
    21 май 2010
    Сообщения:
    466
    Симпатии:
    0
    а как select id from table записать в переменую мускула в формате
    1,2,....7

    пробовал так
    select @res:=CONCAT_WS(',',@res,id) from table
    результат 7
     
  11. Gromo

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

    С нами с:
    24 май 2010
    Сообщения:
    2.786
    Симпатии:
    2
    Адрес:
    Ташкент
    inline
    тут тебе помогут только высокопрофессиональные телепаты экстра-класса.

    берут по 500 баксов в час за консультацию... точнее - ты молчишь, а они тебе всё рассказывают как надо делать ;)
     
  12. inline

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

    С нами с:
    21 май 2010
    Сообщения:
    466
    Симпатии:
    0
    на этот момент вопрос такой

    Есть таблица
    table (id)
    id
    1
    2
    3
    4
    5
    6
    7

    Как средствами мускула получить переменую равну строке "1,2,3,4,5,6,7"

    ???
     
  13. MiksIr

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

    С нами с:
    29 ноя 2006
    Сообщения:
    2.339
    Симпатии:
    44
    GROUP_CONCAT
     
  14. inline

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

    С нами с:
    21 май 2010
    Сообщения:
    466
    Симпатии:
    0
    GROUP_CONCAT(CAST(id AS CHAR) SEPARATOR ',')

    Решение!
     
  15. inline

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

    С нами с:
    21 май 2010
    Сообщения:
    466
    Симпатии:
    0
    MiksIr
    о! спасибо! сразу не обновил и не заметил твого поста!
     
  16. inline

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

    С нами с:
    21 май 2010
    Сообщения:
    466
    Симпатии:
    0
    а как изменить значение group_concat_max_len ?
     
  17. inline

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

    С нами с:
    21 май 2010
    Сообщения:
    466
    Симпатии:
    0
    group_concat_max_len изменил, но длина выводимого GROUP_CONCAT(CAST(id AS CHAR) SEPARATOR ',') не увеличивается
     
  18. inline

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

    С нами с:
    21 май 2010
    Сообщения:
    466
    Симпатии:
    0
    через join-ы сделать можно?
     
  19. Gromo

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

    С нами с:
    24 май 2010
    Сообщения:
    2.786
    Симпатии:
    2
    Адрес:
    Ташкент
    а зачем?
     
  20. inline

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

    С нами с:
    21 май 2010
    Сообщения:
    466
    Симпатии:
    0
    если через IN тормозит страшно (выполнение запросов по 15 сек.)
     
  21. Gromo

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

    С нами с:
    24 май 2010
    Сообщения:
    2.786
    Симпатии:
    2
    Адрес:
    Ташкент
    inline
    даже не представляю как это сделать join-ами. да и не факт что быстрее будет.
    ищи где у тебя что тормозит
     
  22. inline

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

    С нами с:
    21 май 2010
    Сообщения:
    466
    Симпатии:
    0
    Gromo


    кроме group_concat_max_len как еще результат выборки в строку средствами мускула запихнуть?
     
  23. Gromo

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

    С нами с:
    24 май 2010
    Сообщения:
    2.786
    Симпатии:
    2
    Адрес:
    Ташкент
    inline
    по-мойму ты что-то не то мутишь. неправильно поставленные задачи порождают неправильные решения.
    изначально какая стоит задача? зачем тебе переменные в мускуле? или функции работы со строками?
     
  24. inline

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

    С нами с:
    21 май 2010
    Сообщения:
    466
    Симпатии:
    0
    Есть запрос
    [sql]select distinct MARKET_RELATIONS.val as id, MARKET_VALS.name as name from MARKET_RELATIONS, MARKET_VALS where MARKET_RELATIONS.object in (select MARKET_RELATIONS.object from MARKET_RELATIONS where MARKET_RELATIONS.properti=0 and MARKET_RELATIONS.val=528) and MARKET_RELATIONS.object in (select MARKET_RELATIONS.object from MARKET_RELATIONS where MARKET_RELATIONS.properti=2 and MARKET_RELATIONS.val=21) and MARKET_RELATIONS.properti=1 and MARKET_RELATIONS.val=MARKET_VALS.id[/sql]

    использование IN, а точнее дергание БД запросами, в которые "смотрит" IN тормозит выполнение запроса

    нужно запоминать результат запроса, чтобы IN "смотрел" в уже ранее выбраные данные, а не каждый раз выполнялся запрос
     
  25. Gromo

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

    С нами с:
    24 май 2010
    Сообщения:
    2.786
    Симпатии:
    2
    Адрес:
    Ташкент
    [sql]SELECT DISTINCT
    MARKET_RELATIONS.val AS id, MARKET_VALS.name AS name
    FROM
    MARKET_RELATIONS, MARKET_VALS
    WHERE
    MARKET_RELATIONS.object IN
    (SELECT MARKET_RELATIONS.object FROM MARKET_RELATIONS
    WHERE (MARKET_RELATIONS.properti = 0 AND MARKET_RELATIONS.val = 528)
    OR (MARKET_RELATIONS.properti = 2 AND MARKET_RELATIONS.val = 21))
    AND MARKET_RELATIONS.properti = 1 AND MARKET_RELATIONS.val = MARKET_VALS.id[/sql]

    поставь индексы по val, object, properti
    попробуй запрос без и с DISTINCT - тут тоже бывает затык.