За последние 24 часа нас посетили 22710 программистов и 1217 роботов. Сейчас ищут 725 программистов ...

Деление в Select

Тема в разделе "PHP для профи", создана пользователем mainprofilemail, 6 янв 2021.

  1. mainprofilemail

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

    С нами с:
    14 апр 2018
    Сообщения:
    101
    Симпатии:
    2
    Все привет

    Пример конструкции которую использую

    Код (Text):
    1. SELECT
    2.      (SELECT sum_lalala FROM table1) as sum1,
    3.      (SELECT count_lalala FROM table2) as count1,
    4. FROM table3
    и в итоге хочу добиться чтобы сделать вот примерно так
    sum1/count1 as result

    Пробую вот так
    Код (Text):
    1. SELECT
    2.      (SELECT sum_lalala FROM table1) as sum1,
    3.      (SELECT count_lalala FROM table2) as count1,
    4.      sum1/count1 as result
    5. FROM table3
    Не работает. Помогите, плиз)
     
  2. Drunkenmunky

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

    С нами с:
    12 авг 2020
    Сообщения:
    1.477
    Симпатии:
    281
    Помочь можно, отчего ж не помочь.
    Как только будет понятно что на что нужно поделить.
    Приведите примеры таблиц. А так же что ожидаете увидеть в результате запроса.
     
  3. mainprofilemail

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

    С нами с:
    14 апр 2018
    Сообщения:
    101
    Симпатии:
    2
    Не совсем верно написал.
    Вот так будет корректнее
    Код (Text):
    1. SELECT
    2.      (SELECT SUM(sum_lalala) FROM table1) as sum1,
    3.      (SELECT COUNT(count_lalala) FROM table2) as count1,
    4.      sum1/count1 as result
    5. FROM table3
    В итоге, например
    sum1 будет хранить число 150
    count1 будет хранить число 3
    Соответственно нужно сделать это деление внутри запроса.

    Я бы мог сделать вот так
    Код (Text):
    1. SELECT
    2.      (SELECT SUM(sum_lalala) FROM table1) as sum1,
    3.      (SELECT COUNT(count_lalala) FROM table2) as count1,
    4.      (SELECT SUM(sum_lalala) FROM table1) /(SELECT COUNT(count_lalala) FROM table2) as result
    5. FROM table3
    И при выводе получить три столбца. Но не хочется повторно делать запросы
    sum1|count1| result
    150 | 3 | 50
     
    #3 mainprofilemail, 6 янв 2021
    Последнее редактирование: 6 янв 2021
  4. Drunkenmunky

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

    С нами с:
    12 авг 2020
    Сообщения:
    1.477
    Симпатии:
    281
    Из приведенных в пример запросов этого не следует.
    Или таблицы содержат по одной записи?
    Дайте примеры таблиц.
     
  5. mainprofilemail

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

    С нами с:
    14 апр 2018
    Сообщения:
    101
    Симпатии:
    2
    Нет, таблицы содержат очень много строк. И на самом деле запрос выглядит намного сложнее.
    И в sum1 and count1 находится как раз то что я Вам написал, за исключением того что на самом деле там другие цифры.
    Но суть даже не в этом.

    Суть в том чтобы сделать деление без повторного выполнения вложенных запросов. Так как у нас уже есть все для этого данные в sum1 and count1

    Да данный момент во время деления я получаю ошибку что sum1 не найден
     
    #5 mainprofilemail, 6 янв 2021
    Последнее редактирование: 6 янв 2021
  6. Drunkenmunky

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

    С нами с:
    12 авг 2020
    Сообщения:
    1.477
    Симпатии:
    281
    Если запросы получающие эти числа выглядят именно так, как в примерах выше, то так и должно быть.
    Вы получаете весь массив строк, без объединения.
    Я так понимаю, таблицы настолько секретные, что образцов не будет?
     
  7. mainprofilemail

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

    С нами с:
    14 апр 2018
    Сообщения:
    101
    Симпатии:
    2
    Просто для меня не совсем понятно что Вы там хотите увидеть? Если там ничего кроме цифр нету. Просто в одном случае мы получаем сумму чисел, а во втором количество строк. Вот и нужно сделать деление без повторных запросов.

    Так как, вот это работает
    Код (Text):
    1. SELECT
    2.      (SELECT SUM(sum_lalala) FROM table1) as sum1,
    3.      (SELECT COUNT(count_lalala) FROM table2) as count1,
    4.      (SELECT SUM(sum_lalala) FROM table1) /(SELECT COUNT(count_lalala) FROM table2) as result
    5. FROM table3
    А если делать замену запросов при делении на псевдонимы, то уже нет
    Код (Text):
    1. SELECT
    2.      (SELECT SUM(sum_lalala) FROM table1) as sum1,
    3.      (SELECT COUNT(count_lalala) FROM table2) as count1,
    4.      sum1 / count1 as result
    5. FROM table3
    Просто я хочу повторяющиеся запросы заменить на псевдонимы ранее полученных результатов. Вот и все. Но не знаю как правильно сделать деление с использование псевдонимов вместо запросов
     
  8. Drunkenmunky

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

    С нами с:
    12 авг 2020
    Сообщения:
    1.477
    Симпатии:
    281
    Пример запроса деления по одному значению из разных таблиц
    Код (Text):
    1.  
    2. SELECT (`t1`.`colX` / `t2`.`colY`) AS `result`
    3. FROM `t1`, `t2`
    4. WHERE `t1`.`idx` = 'x'
    5. AND `t2`.`idy` = 'y'
    При этом нужно понимать, что если `idx` и `idy` неуникальны, то ответов может быть больше, чем один.
     
    #8 Drunkenmunky, 6 янв 2021
    Последнее редактирование: 6 янв 2021
  9. mainprofilemail

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

    С нами с:
    14 апр 2018
    Сообщения:
    101
    Симпатии:
    2

    Хорошо, допустим. Но как мне вместо `t1`.`colX` / `t2`.`colY` поставить sum1 / count1?
     
  10. Drunkenmunky

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

    С нами с:
    12 авг 2020
    Сообщения:
    1.477
    Симпатии:
    281
    Код (Text):
    1.  
    2. SELECT (SUM(`t1`.`colX`) / COUNT(`t2`.`colY`)) AS `result`
    3. FROM `t1`, `t2`
     
  11. mainprofilemail

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

    С нами с:
    14 апр 2018
    Сообщения:
    101
    Симпатии:
    2
    Но это получиться в итоге снова повторный пересчет данных, если я не ошибаюсь. Что приведет к повторным вычислениям sum1 и coun1 и только потом деление. Именно этого я и хочу избежать чтобы база на 1,5 млн записей обрабатывалась как можно быстрее
     
  12. Drunkenmunky

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

    С нами с:
    12 авг 2020
    Сообщения:
    1.477
    Симпатии:
    281
    Приведите пример таблиц.
    Приведите пример ожидаемого результата вычислений.