За последние 24 часа нас посетили 17386 программистов и 1619 роботов. Сейчас ищут 2103 программиста ...

помогите с запросом из нескольких таблиц

Тема в разделе "MySQL", создана пользователем Koc, 26 июл 2008.

  1. Mr.M.I.T.

    Mr.M.I.T. Старожил

    С нами с:
    28 янв 2008
    Сообщения:
    4.586
    Симпатии:
    1
    Адрес:
    у тебя канфетка?
    короче, храни прямо массив в БД
    serialize\unserialize в помощь
     
  2. Koc

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

    С нами с:
    3 мар 2008
    Сообщения:
    2.253
    Симпатии:
    0
    Адрес:
    \Ukraine\Dnepropetrovsk
    Mr.M.I.T.
    этот вариант был рассмотрен мною ранее и отброшен как неподходящий.
    И ваще хочу добиться хотя бы NF1
     
  3. Koc

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

    С нами с:
    3 мар 2008
    Сообщения:
    2.253
    Симпатии:
    0
    Адрес:
    \Ukraine\Dnepropetrovsk
    братцы, помогите, разработка встала. Запрос не такой уж и тривиальный.

    Код (Text):
    1.  
    2. --есть таблицы
    3. id
    4. 1
    5. 2
    6. 5
    7.  
    8. oid|gid|quantity|price
    9. 1  |  2|       4|   10
    10. 1  |  9|       1|   14
    11. 2  | 11|       2|   20
    12. 5  |  7|       4|    4
    13. 5  |  5|       3|    6
    14. 5  | 36|       1|   11
    15.  
    16. --запрос должен вывести:
    17. id|sum
    18.  1| 54  -- так как 10*4+14*1
    19.  2| 40  -- 20*2
    20.  5| 45  -- 4*4+6*3+11*1
     
  4. akrinel

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

    С нами с:
    26 янв 2009
    Сообщения:
    955
    Симпатии:
    1
    Адрес:
    Spb
    [sql]
    CREATE TABLE IF NOT EXISTS `data` (
    `oid` int(11) NOT NULL,
    `gid` int(11) NOT NULL,
    `quantity` int(11) NOT NULL,
    `price` int(11) NOT NULL
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;


    INSERT INTO `data` (`oid`, `gid`, `quantity`, `price`) VALUES
    (1, 2, 4, 10),
    (1, 9, 1, 14),
    (2, 11, 2, 20),
    (5, 7, 4, 4),
    (5, 5, 3, 6),
    (5, 36, 1, 11);


    CREATE TABLE IF NOT EXISTS `ids` (
    `id` int(11) NOT NULL
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

    INSERT INTO `ids` (`id`) VALUES
    (1),
    (2),
    (5);
    [/sql]

    Запрос:
    [sql]
    SELECT `i`.`id`, SUM(`d`.`price`*`d`.`quantity`) FROM `ids` AS `i`
    LEFT JOIN `data` AS `d`
    ON `i`.`id`=`d`.`oid`
    GROUP BY `i`.`id`
    [/sql]

    Результат запроса:
    Код (Text):
    1.  
    2. id  SUM(`d`.`price`*`d`.`quantity`)
    3. 1   54
    4. 2   40
    5. 5   45
    Вроде работает, особо не тестил.
     
  5. Koc

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

    С нами с:
    3 мар 2008
    Сообщения:
    2.253
    Симпатии:
    0
    Адрес:
    \Ukraine\Dnepropetrovsk
    оу, ее, премного благодарен.
    оффтоп: посоветуйте че-нить хорошее по теории SQL, что б и я такие запросы мог писать =).
     
  6. akrinel

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

    С нами с:
    26 янв 2009
    Сообщения:
    955
    Симпатии:
    1
    Адрес:
    Spb
    //Акринел почувствовал, что к его 20-ти годам приплюсовали еще годков эдак 30-40


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

    Psih меня подсадил на любопытный блог, когда не лениво продираться сквозь дебри английского языка читаю.

    Ну и еще есть упражнения, но я пока так за них и всерьез и не взялся.
     
  7. Koc

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

    С нами с:
    3 мар 2008
    Сообщения:
    2.253
    Симпатии:
    0
    Адрес:
    \Ukraine\Dnepropetrovsk
    akrinel
    )) я в инете на ты, имел ввиду, что бы все советовали.

    Сейчас у меня есть Люк Веллинг и Лора Томсон "MySQL. Учебное пособие", Вильямс 2005. Но из-за большого кол-ва работы совсем нет времени на ее изучение.

    upd: в итоге у меня такой запрос
    [sql]SELECT
    o.id, o.uid, o.mid, o.timestamp, o.status,
    SUM(og.price*og.quantity),
    u.login, u.name, u.fname, u.surname,
    m.name AS manager
    FROM `tt_user` AS u, `tt_admin` AS m, `tt_orders` AS o
    LEFT JOIN `tt_orders_goods` AS og
    ON o.id=og.oid
    WHERE o.uid=u.id AND o.mid=m.id
    GROUP BY og.oid
    ORDER BY `o`.`id` ASC[/sql]
    `tt_orders` AS o - должно быть последним в списке, иначе ошибка - неизвестное поле o.id. Почему так?