За последние 24 часа нас посетили 10440 программистов и 907 роботов. Сейчас ищут 282 программиста ...

Объединить два запроса по горизонтальному

Тема в разделе "MySQL", создана пользователем Искандар, 22 окт 2019.

  1. Искандар

    Искандар Активный пользователь

    С нами с:
    18 фев 2017
    Сообщения:
    76
    Симпатии:
    6
    Всем доброго времени суток!
    Есть два запроса:
    1:
    PHP:
    1. SELECT date, name, SUM(summa)
    2. FROM table1
    3. GROUP BY date, name
    2:
    PHP:
    1. SELECT date, name, SUM(p_summa)
    2. FROM table2
    3. GROUP BY date, name
    Мне надо их объединить по горизонтальному.
    Без привязки друг к другу. Если на первой таблице 10 строк и на второй таблице 5, то в итоговой таблице 10 строк должно быть. Если на первой таблице 5 и на второй таблице 10 строк, то то в итоговой таблице 10 строк должно быть.
    Спасибо!
     
  2. ADSoft

    ADSoft Старожил

    С нами с:
    12 мар 2007
    Сообщения:
    3.386
    Симпатии:
    649
    Адрес:
    Татарстан
    новое какое-то понятие - "объединить по горизонтальному"

    Имеется ввиду - объединить два результата и выдать только 10?
    Код (Text):
    1.  
    2. SELECT * FROM ((запрос 1) UNION (запрос 2)) LIMIT 10
     
  3. Valick

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

    С нами с:
    12 авг 2018
    Сообщения:
    1.911
    Симпатии:
    328
    @ADSoft, это по вертикальному :)
     
  4. yanuzay

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

    С нами с:
    28 мар 2018
    Сообщения:
    483
    Симпатии:
    56
    или по внутреннему соединению , т.е. inner join ?
     
  5. Chushkin

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

    С нами с:
    17 дек 2010
    Сообщения:
    1.060
    Симпатии:
    89
    Адрес:
    Мещёра, Центр, Болото N3
    Лучше всего: сделать два запроса и объединить на стороне клиента.

    п.с. Можно и SQL-запросом, но это менее эффективно.
     
  6. ADSoft

    ADSoft Старожил

    С нами с:
    12 мар 2007
    Сообщения:
    3.386
    Симпатии:
    649
    Адрес:
    Татарстан
    Исходя из каких соображений такие выводы? Чем менее эффективно?
     
  7. Chushkin

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

    С нами с:
    17 дек 2010
    Сообщения:
    1.060
    Симпатии:
    89
    Адрес:
    Мещёра, Центр, Болото N3
    3-и temporary tables + Using filesort.

    Хуже - в общем случае. На малом количестве записей разницы не будет практически. Может даже наоборот.
    Запрос будет что-то вроде:
    PHP:
    1. select date, name, max(s1) s1, max(s2) s2
    2. from
    3.     ((SELECT date, name, SUM(summa) s1, null s2
    4.     FROM table1
    5.     GROUP BY date, name)
    6. union all
    7.     (SELECT date, name, null, SUM(p_summa)
    8.     FROM table2
    9.     GROUP BY date, name)) t
    10. group by date, name
    --- Добавлено ---
    п.с. Кстати, этот запрос не полностью выполняет условия ТС. В реальности будет ещё сложнее.
     
  8. ADSoft

    ADSoft Старожил

    С нами с:
    12 мар 2007
    Сообщения:
    3.386
    Симпатии:
    649
    Адрес:
    Татарстан
    не знаю, откуда такие домыслы....
    откуда в итоговом взялись max, зачем s, null и группировки непонятно... в исходном задании ТС ничего такого не говорил... и запросы у него другие....
    насчет того что запрос сложнее - само собой
    но если делать два - то выборка по (1 табл + filesort) * 2 плюс наклакдные расходы для отправки запроса, приема результата * 2, + время работы пыхо скрипта, который массивы будет объединять

    а вообще не зная задачу полностью. тут пыжимся, возможно БД спроектирована неверно, и вообще все в одной таблице может быть, либо связи меж таблицами есть )))
     
  9. Искандар

    Искандар Активный пользователь

    С нами с:
    18 фев 2017
    Сообщения:
    76
    Симпатии:
    6
    Всем доброе утро!
     

    Вложения:

  10. Valick

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

    С нами с:
    12 авг 2018
    Сообщения:
    1.911
    Симпатии:
    328
    Ещё немного и форум начнёт оптовые поставки клиентов в дурдом((
     
  11. Искандар

    Искандар Активный пользователь

    С нами с:
    18 фев 2017
    Сообщения:
    76
    Симпатии:
    6
  12. Valick

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

    С нами с:
    12 авг 2018
    Сообщения:
    1.911
    Симпатии:
    328
    @Искандар, желания не могут возникать с потолка, точнее могут, но про это моё предыдущее сообщение.
    Прежде чем лезть в программирование, необходимо научиться грамотно ставить перед собой задачу. Этого невозможно достичь не обладая хотяб базовыми знаниями.
     
  13. Искандар

    Искандар Активный пользователь

    С нами с:
    18 фев 2017
    Сообщения:
    76
    Симпатии:
    6
    Хорошо. Я Вас понял. Но мне очень сложно задать вопрос на русском, так как я боюсь допустить грамматические ошибки...
     
  14. Valick

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

    С нами с:
    12 авг 2018
    Сообщения:
    1.911
    Симпатии:
    328
    @Искандар, грамматические ошибки не страшно, мы же не на форуме "грамматики русского языка" :)
    А вот чтение книг по программированию на любом удобном для тебя языке никто не отменял. А код он и в африке код.
     
  15. Chushkin

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

    С нами с:
    17 дек 2010
    Сообщения:
    1.060
    Симпатии:
    89
    Адрес:
    Мещёра, Центр, Болото N3
    >> откуда в итоговом взялись max,
    Надеюсь, это риторический вопрос. Ибо ты знаешь работу запроса с group by.

    >> зачем s, null и группировки непонятно...
    Ты знаешь как сделать по другому?
    Предложи, а я поучусь. Учиться не вредно...

    >> в исходном задании ТС ничего такого не говорил...
    Говорил. Условие "по горизонтальному" - насколько я понимаю его мысль, требуется значения обоих sum() в одной строке.

    >> и запросы у него другие....
    Идентичные.

    >> насчет того что запрос сложнее - само собой
    но если делать два - то выборка по (1 табл + filesort) * 2 плюс наклакдные расходы для отправки запроса, приема результата * 2, + время работы пыхо скрипта, который массивы будет объединять<<
    Повторюсь, на малых данных (десятки-сотни, может тысячи) разницы не будет. Больше - надо проверять.
    Проще потому, что там ещё есть условие "5+10 -> 10", "10+5 -> 10". Попробуй сделать это в одном запросе, потом расскажешь.
    (с учётом, что 5,10 это абстрактные цифры, для примера)

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

    ADSoft Старожил

    С нами с:
    12 мар 2007
    Сообщения:
    3.386
    Симпатии:
    649
    Адрес:
    Татарстан
    у...... судя по таблицам, я думаю БД неверно спланирована
    нужно разбираться почему две таблицы, почему так объединять итд