Вопросы по MySQL

Тема в разделе "Общие вопросы", создана пользователем R1KO, 25 мар 2015.

  1. R1KO

    R1KO Супер-модератор

    Сообщения:
    5.993
    Симпатии:
    2.989
    Понадобилось в плагине выбрать несколько значений из разных таблиц одним запросом.

    Имеется:
    n кол-во таблиц: table_1, table_2, ..., table_n.
    m кол-во столбцов: column_1, column_2, ..., column_m.

    Нужно выбрать из нескольких таблиц значения разных столбцов.

    Что-то вроде:
    PHP:
    SELECT `table_1`.`column_1`, `table_1`.`column_2`, `table_2`.`column_1`, `table_2`.`column_2FROM ... WHERE .. 
    Как это правильней и оптимальней сделать?
     
    Последнее редактирование: 7 апр 2015
  2. NagarD

    NagarD

    Сообщения:
    412
    Симпатии:
    170
    Re: Несколько Select запросов в одном.

    join
     
  3. Хитрый_Ёжик

    Хитрый_Ёжик

    Сообщения:
    281
    Симпатии:
    94
    Re: Несколько Select запросов в одном.

    R1KO, не помешала бы реальная или, хотя бы, примерная структура... Либо JOIN, либо UNION. Зависит от задачи.
     
  4. R1KO

    R1KO Супер-модератор

    Сообщения:
    5.993
    Симпатии:
    2.989
    Re: Несколько Select запросов в одном.

    [​IMG]

    Вот нужно из всех 3-х таблиц выбрать по несколько полей, при чем с разными условиями.
     
  5. Vaio

    Vaio

    Сообщения:
    628
    Симпатии:
    218
    Re: Несколько Select запросов в одном.

    Если джоинить никак, то лучше сделай 3 запроса.
     
  6. R1KO

    R1KO Супер-модератор

    Сообщения:
    5.993
    Симпатии:
    2.989
    Re: Несколько Select запросов в одном.

    Vaio, в том то и дело что всё должно быть одним запросом.
     
  7. Argonavt

    Argonavt

    Сообщения:
    34
    Симпатии:
    8
    Re: Несколько Select запросов в одном.

    R1KO, у этих таблицах есть что-то общее? id , ip, name , steam_id например? Для обьедениния, необходимо связующее звено, оно существует? Без более подробной структуры мы вряд ли сможем тебе помочь.
     
  8. R1KO

    R1KO Супер-модератор

    Сообщения:
    5.993
    Симпатии:
    2.989
    Re: Несколько Select запросов в одном.

    Argonavt, это таблицы sourcebans
    Мне нужно по ид бана выбрать всего его поля + ник админа (по aid) + ип:порт сервера (по sid) + количество банов + количество блокировок.

    Вот была наработка, но не работает запрос:
    PHP:
    FormatEx(sQuerysizeof(sQuery), "SELECT `name`, \
                                                `authid`, \
                                                `ip`, \
                                                `created`, \
                                                `length`, \
                                                `ends`, \
                                                `reason`, \
                                                (SELECT `user` FROM `%s_admins` WHERE `aid` = '%i'), \
                                                (SELECT `ip`, `port` FROM `%s_servers` WHERE `sid` = '%i'), \
                                                (SELECT COUNT(*) FROM `%s_bans` WHERE `authid` = '%s'), \
                                                (SELECT COUNT(*) FROM `%s_banlog` WHERE `bid` = '%i') \
                                                FROM `%s_bans` WHERE `bid` = '%i';"
    ,
                                                
    DatabasePrefix,
                                                
    iAID,
                                                
    DatabasePrefix,
                                                
    iSID,
                                                
    DatabasePrefix,
                                                
    sAuth,
                                                
    DatabasePrefix,
                                                
    iBID,
                                                
    DatabasePrefix,
                                                
    iBID);
    Вопрос задавал в общем виде т.к. еще нужно для других нужд.
     
  9. Argonavt

    Argonavt

    Сообщения:
    34
    Симпатии:
    8
    Re: Несколько Select запросов в одном.

    SELECT * FROM sb_bans ban
    LEFT JOIN sb_admins adm ON ban.aid = adm.aid
    LEFT JOIN sb_servers srv ON ban.sid = srv.sid
    LEFT JOIN (SELECT count(*) blocCounts, bid FROM sb_banlog log GROUP BY bid) countBlocks ON countBlocks.bid = ban.bid
    LEFT JOIN (SELECT count(*) banCounts, authid FROM sb_bans bans GROUP BY authid) counBans ON counBans.authid = ban.authid
    WHERE ban.bid = 666

    Вот что-то примерное на чистом SQL
     
  10. R1KO

    R1KO Супер-модератор

    Сообщения:
    5.993
    Симпатии:
    2.989
    Re: Несколько Select запросов в одном.

    Argonavt, проверю - отпишусь
     
  11. NagarD

    NagarD

    Сообщения:
    412
    Симпатии:
    170
    Re: Несколько Select запросов в одном.


    Подзапрос должен возвращать только один результат, ну и нужны псевдо.

    PHP:
    FormatEx(sQuerysizeof(sQuery), "SELECT `name`, \
                                                `authid`, \
                                                `ip`, \
                                                `created`, \
                                                `length`, \
                                                `ends`, \
                                                `reason`, \
                                                (SELECT `user` FROM `%s_admins` WHERE `aid` = '%i') as admin_user, \
                                                (SELECT `ip`FROM `%s_servers` WHERE `sid` as = '%i') as server_ip, \
                                                (SELECT `port` FROM `%s_servers` WHERE `sid` as = '%i') as server_port, \
                                                (SELECT COUNT(*) FROM `%s_bans` WHERE `authid` = '%s') as bans_count, \
                                                (SELECT COUNT(*) FROM `%s_banlog` WHERE `bid` = '%i') as banlog_count \
                                                FROM `%s_bans` WHERE `bid` = '%i';"
    ,
                                                
    DatabasePrefix,
                                                
    iAID,
                                                
    DatabasePrefix,
                                                
    iSID,
                                                
    DatabasePrefix,
                                                
    iSID,
                                                
    DatabasePrefix,
                                                
    sAuth,
                                                
    DatabasePrefix,
                                                
    iBID,
                                                
    DatabasePrefix,
                                                
    iBID); 
     
    FrozDark и R1KO нравится это.
  12. R1KO

    R1KO Супер-модератор

    Сообщения:
    5.993
    Симпатии:
    2.989
    Re: Несколько Select запросов в одном.

    NagarD, спасибо, всё норм. НО!
    Ругалось. поправил
     
  13. R1KO

    R1KO Супер-модератор

    Сообщения:
    5.993
    Симпатии:
    2.989
    Кто часто работает с базами из-под плагинов, как решить проблемы с кодировкой?
    После коннекта к базе установка кодировки 1 раз не помогает. Ставить её перед каждым запросом что-ли?
     
  14. semjef

    semjef semjef.ru

    Сообщения:
    1.031
    Симпатии:
    473
    "Это маааагия" - вот что я ору, когда пропадают проблемы с кодировкой.
     
    komashchenko нравится это.
  15. komashchenko

    komashchenko

    Сообщения:
    479
    Симпатии:
    421
    Я и перед каждым запросом ставил кодировку но оно все равно не помогало, но точно знаю что если в базе по умолчанию нужная кодировка то все норм - хотя это и так понятно :)