За последние 24 часа нас посетили 21770 программистов и 1008 роботов. Сейчас ищут 690 программистов ...

1 запрос в 2 таблицы + матчасть

Тема в разделе "MySQL", создана пользователем ArsNet, 6 дек 2016.

  1. ArsNet

    ArsNet Новичок

    С нами с:
    24 май 2016
    Сообщения:
    288
    Симпатии:
    24
    Адрес:
    Владивосток
    Помогите решить задачу без лишней нагрузки на MySQL:

    есть 2 таблицы. в 1-й содержится список кодов ТМЦ. В 2-й документы с количеством и кодами ТМЦ.

    Задача: Выбрать все коды тмц в второй таблице в соответствии с кодами тмц в первой таблице и сложить их значения с столбца `kol`.

    например: Берем в таблице1 первый код, ищем в таблице 2 все записи где table1['tmc'] = table2['tmc'] и складываем все их значения в переменную. Тоже самое с следующим кодом.

    Как этио сделать в режиме цикл в цикле я знаю, но тогда получается что запрос к БД тоже в цикле, что не есть хорошо и сильно увеличивает нагрузку на сервер. помогите грамотно решить задачу.
     
  2. Slavka

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

    С нами с:
    1 окт 2013
    Сообщения:
    722
    Симпатии:
    41
    тяжело понять

    но это класический join - только я так и не понял что с чем складывать =)

    попробуй тут обрисуй =) может понятней будет

    http://sqlfiddle.com/
     
  3. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.410
    Симпатии:
    1.768
    сумма? или посчитать сколько нашел?
    --- Добавлено ---
    Код (Text):
    1. select sum(хз что) table2 t2
    2. join table1 t1 on t1.tmc = t2.tmc
    3. group by t1.tmc
    как-то так
     
    denis01 и ArsNet нравится это.
  4. ArsNet

    ArsNet Новичок

    С нами с:
    24 май 2016
    Сообщения:
    288
    Симпатии:
    24
    Адрес:
    Владивосток
    Должна быть именно сумма. Кодом попробую представить чтобы понятнее было.

    Код (Text):
    1. $qw = mysql_query("SELECT tmc FROM sklad");
    2.  
    3. while($qw = mysql_query("SELECT tmc FROM sklad")){
    4.  
    5. $q = mysql_query("SELECT kol FROM skladfakt WHERE tmc='$qw[tmc]'");
    6. $koll = 0;
    7. while($qq = mysql_fetch_array($q)){
    8. $koll = $koll + $qq['kol'];
    9.  
    10. }
    11. }
    Что-то типо того
     
  5. ArsNet

    ArsNet Новичок

    С нами с:
    24 май 2016
    Сообщения:
    288
    Симпатии:
    24
    Адрес:
    Владивосток
    Опс в3й строчке ошибка. Ну думаю вы поймете по коду че к чему
     
  6. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.410
    Симпатии:
    1.768
    ты ждёшь готовое решение? джоин предложенный мной пробовал?
     
    denis01 и ArsNet нравится это.
  7. ArsNet

    ArsNet Новичок

    С нами с:
    24 май 2016
    Сообщения:
    288
    Симпатии:
    24
    Адрес:
    Владивосток
    Я ответил на поставленный выше вопрос.

    По поводу JOIN пробую но не могу сообразить правильный синтаксис
     
  8. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.410
    Симпатии:
    1.768
    попробуй, да
     
    denis01 и ArsNet нравится это.
  9. ArsNet

    ArsNet Новичок

    С нами с:
    24 май 2016
    Сообщения:
    288
    Симпатии:
    24
    Адрес:
    Владивосток
    Чет ничего понять не могу.
    Код (Text):
    1. $mt = mysql_query("SELECT sum(kol) rashodfakt t2 JOIN 51840 t1 on t1.tmc = t2.tmc group by t1.tmc");
    2.  
    3. $s = mysql_fetch_array($mt);
    Ругается на строку $s = mysql_fetch_array($mt);
     
  10. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.410
    Симпатии:
    1.768
    это как так?
     
    denis01 и ArsNet нравится это.
  11. ArsNet

    ArsNet Новичок

    С нами с:
    24 май 2016
    Сообщения:
    288
    Симпатии:
    24
    Адрес:
    Владивосток
    51840 это название таблицы в базе просто по номеру склада
     
  12. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.410
    Симпатии:
    1.768
    это крайне хуёвое название таблицы, друг.

    Возьми её в обратные кавычки тогда.
    --- Добавлено ---
    потому что надо проверять, что именно вернулось. может там вернулось ничего или ошибка.
     
    denis01 и ArsNet нравится это.
  13. ArsNet

    ArsNet Новичок

    С нами с:
    24 май 2016
    Сообщения:
    288
    Симпатии:
    24
    Адрес:
    Владивосток
    Код (Text):
    1. $mt = mysql_query("SELECT sum(kol) `rashodfakt` t2 JOIN `51840` t1 on t1.tmc = t2.tmc group by t1.tmc");
    2. $s = mysql_fetch_array($mt);
    Результат тот же :(

    Warning: mysql_fetch_array() expects parametr 1 to be resource. boolean given in bla bla bla on line 3
     
  14. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.410
    Симпатии:
    1.768
    запрос пихай в пма и смотри ошибку
     
    denis01 и ArsNet нравится это.
  15. ArsNet

    ArsNet Новичок

    С нами с:
    24 май 2016
    Сообщения:
    288
    Симпатии:
    24
    Адрес:
    Владивосток
    Куда куда? Я самоучка и много еще не знаю.
    --- Добавлено ---
    При проведении запроса через phpMyAdmin ругается на t2. Говорит мол Псевдоним был найден ранее. (near "t2" at position 27)
     
  16. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.410
    Симпатии:
    1.768
    нижнаю. напиши без псевдонимов указывая название таблицы каждый раз.
     
    denis01 и ArsNet нравится это.
  17. ArsNet

    ArsNet Новичок

    С нами с:
    24 май 2016
    Сообщения:
    288
    Симпатии:
    24
    Адрес:
    Владивосток
    Это примерно как? Просто я с оператором JOIN раньше не работал
     
  18. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.410
    Симпатии:
    1.768
    SELECT sum(kol) `rashodfakt` JOIN `51840` on `51840`.`tmc` = `rashodfakt`.`tmc` group by `51840`.`tmc`
     
    denis01 и ArsNet нравится это.
  19. ArsNet

    ArsNet Новичок

    С нами с:
    24 май 2016
    Сообщения:
    288
    Симпатии:
    24
    Адрес:
    Владивосток
    Написал вот так:
    SELECT sum(kol) FROM `rashodfakt` JOIN `51840` on `51840`.`tmc` = `rashodfakt`.`tmc` group by `51840`.`tmc`
    Ошибка пропала.

    А как теперь вывести эту сумму?

    Доделал вот так :
    SELECT sum(`kol`) `sum` FROM `rashodfakt` JOIN `51840` on `51840`.`tmc` = `rashodfakt`.`tmc` group by `51840`.`tmc`

    И вывел через цикл:
    while ($s = mysql_fetch_array($mt)){
    echo $s['sum'];
    }

    но некоторые значения получаются вида 69.9999999481188
    Обработка через trim ни к чему не приводит. :(
     
    #19 ArsNet, 14 дек 2016
    Последнее редактирование: 14 дек 2016
  20. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.410
    Симпатии:
    1.768
    округляй =)
     
    denis01 и ArsNet нравится это.
  21. ArsNet

    ArsNet Новичок

    С нами с:
    24 май 2016
    Сообщения:
    288
    Симпатии:
    24
    Адрес:
    Владивосток
    Через round незя. Там есть и значения с плавающей точкой.

    Тут возник следующий вопрос. Возможно выбрать 1-м запросом:
    SELECT sum(`kol`)`rsum` FROM `rashodfakt` WHERE `51840`.`tmc` = `rashodfakt`.`tmc` и
    SELECT sum(`kol`)`psum` FROM `prihod` WHERE `51840`.`tmc` = `prihod`.tmc и
    SELECT sum(`kol`)`pfsum` FROM `prihodfakt` WHERE `51840`.`40` = `prihodfakt`.`tmc`

    Можно все это безобразие как нить в 1 запрос затолкать?
     
  22. ArsNet

    ArsNet Новичок

    С нами с:
    24 май 2016
    Сообщения:
    288
    Симпатии:
    24
    Адрес:
    Владивосток
    Надо вывести получается все строки из таблицы 51840, суммировать все kol в rashodfakt, prihod, prihodfakt WHERE 51840.tmc = tmc

    Потом вывести циклом:
    tmc -> rashodfakt.kol -> prihod.kol -> prihodfakt.kol <br>
     
  23. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.410
    Симпатии:
    1.768
    UNION

    только я тя умоляю, переименуй таблицу, пока не поздно. Так, чтоб с буквы начиналась. И столбец. Вообще, названия дают по сущностям, а не номеру склада. Все склады должны жить в одной таблице. У них должно быть поле для принадлежности к конкретному складу.
     
    denis01 и ArsNet нравится это.
  24. ArsNet

    ArsNet Новичок

    С нами с:
    24 май 2016
    Сообщения:
    288
    Симпатии:
    24
    Адрес:
    Владивосток
    Уже поздно. Слишком много на ней завязано. Чет я через JOIN сделал он мне не все позиции с 51840 выводит. Я так понимаю позиции которые в rashodfakt не найдены он не вывел.

    О ! Еще один новый оператор для меня. Этот с чем едят?
     
  25. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.230
    Симпатии:
    1.715
    Адрес:
    Молдова, г.Кишинёв
    Прочитай лучше книгу, пытайся искать в интернете