Правила     Закладки     Карма    Календарь    Журналы    Помощь    Поиск    PDA    Чат   
        СМС-ки
   
Пейджер выключен!
 
Фильтр авторов:    показать 
  скрыть
  Ответ в темуСоздание новой темыСоздание опроса

> Помогите собрать в один запрос
McLotos  
 ۩  [x] Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



武士道
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 1225
Пользователь №: 28342
На форуме: 5 лет, 5 месяцев, 20 дней
Карма: 28




Всем привет. Вожусь с задачей, не могу собрать в один запрос.
Получаю количество уникальных idLoan за каждый месяц текущего года
SELECT COUNT(DISTINCT(`idLoan`)) as `count`,
MONTH(STR_TO_DATE(`date`, '%d.%m.%Y')) as `month`,
YEAR(STR_TO_DATE(`date`, '%d.%m.%Y')) as `year`
FROM `main`
WHERE `idLoan`>0
AND YEAR(STR_TO_DATE(`date`, '%d.%m.%Y')) = YEAR(CURDATE())
GROUP BY `month`, `year`
ORDER BY `year`, `month`

Теперь к каждой полученной строке нужно прикрутить результаты вот этих запросов:
SELECT COUNT(DISTINCT(`idLoan`)) as `a1`
FROM `main`
WHERE `idLoan`>0
AND YEAR(STR_TO_DATE(`date`, '%d.%m.%Y')) = YEAR(CURDATE())
AND `answer` IN (1,2);
SELECT COUNT(DISTINCT(`idLoan`)) as `a2`
FROM `main`
WHERE `idLoan`>0
AND YEAR(STR_TO_DATE(`date`, '%d.%m.%Y')) = YEAR(CURDATE())
AND `answer`=2;
SELECT COUNT(DISTINCT(`idLoan`)) as `accepted`
FROM `request`
WHERE `status`='18'
AND `archive`='1' ;

Пробовал через UNION, но сервер ругается что количество колонок не совпадает.
Хотел сделать через JOIN, но сервер говорит что нельзя делать join внутри одной таблицы (хотя странно, я видел такие примеры в сети)


--------------------
программирование - инструмент для решения конкретных задач, любая попытка спроектировать что-то универсальное приведет к провалу.©paul85
В любом случае тебе прийдётся пройти путь изобретения велосипеда, который прошли другие, только причиной твоего изобретения будет непонимание принципов работы велосипеда изобретённого другими людьми.©SlavaFr
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
sergeiss  
Дата
Цитировать сообщение

Пользователь сейчас на форуме



Сидел он, дум великих полон - и вдаль глядел
******

Профиль
Группа: Эксперт
Группа переписки
Сообщений: 14965
Пользователь №: 4190
На форуме: 8 лет, 9 месяцев, 26 дней
Карма: 443




Цитата (McLotos @ 16.11.2016 - 08:09)
но сервер говорит что нельзя делать join внутри одной таблицы (хотя странно, я видел такие примеры в сети)

Если джойнишь таблицу саму с собой, то обязательно нужны алиасы. Тогда, формально, это получаются как бы разные таблицы. Но это общие рассуждения, насчет процитированной фразы. В сам запрос я не вникал, сорри, некогда.


--------------------
* Хэлп по PHP
* Описалово по JavaScript
* Хэлп и СУБД для PostgreSQL

* Обучаю PHP, JS, вёрстке. Интерактивно и качественно. За разумные деньги.

* "накапливаю умение телепатии" (С) и "гуглю за ваш счет" (С)

user posted image
PMICQ
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
depp  
Дата
Цитировать сообщение

Пользователь сейчас на форуме



Здесь живет
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 290
Пользователь №: 40589
На форуме: 1 год, 11 месяцев, 29 дней
Карма: 19




почему нельзя сократить вот это:
MONTH(STR_TO_DATE(`date`, '%d.%m.%Y'))
на это:
MONTH(`date`)
?
ну и YEAR тоже самое.
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
S.Chushkin  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Пофигист
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 777
Пользователь №: 36058
На форуме: 3 года, 11 месяцев, 6 дней
Карма: 40




Задачу можно решить многими способами.
1) Оставьте как есть, если данные правильные.
2) Делать 2 запроса. Вторую часть легко объединить.
3) Объединить все запросы в один, добавив нужное количество полей, в виде NULL.
4) Получить данные через SELECT, используя указанные запросы в виде подзапросов.
и т.п.


--------------------
PM
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
McLotos  
 ۩  Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



武士道
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 1225
Пользователь №: 28342
На форуме: 5 лет, 5 месяцев, 20 дней
Карма: 28




Цитата (depp @ 16.11.2016 - 13:21)
почему нельзя сократить вот это:
MONTH(STR_TO_DATE(`date`, '%d.%m.%Y'))
на это:
MONTH(`date`)
?
ну и YEAR тоже самое.

Потому-что поле date внезапно имеет тип text (архитектор БД просто молодец)


--------------------
программирование - инструмент для решения конкретных задач, любая попытка спроектировать что-то универсальное приведет к провалу.©paul85
В любом случае тебе прийдётся пройти путь изобретения велосипеда, который прошли другие, только причиной твоего изобретения будет непонимание принципов работы велосипеда изобретённого другими людьми.©SlavaFr
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
S.Chushkin  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Пофигист
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 777
Пользователь №: 36058
На форуме: 3 года, 11 месяцев, 6 дней
Карма: 40




Цитата (McLotos @ 17.11.2016 - 14:28)
Потому-что поле date внезапно имеет тип text

В Вашей таблице?


--------------------
PM
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
sergeiss  
Дата
Цитировать сообщение

Пользователь сейчас на форуме



Сидел он, дум великих полон - и вдаль глядел
******

Профиль
Группа: Эксперт
Группа переписки
Сообщений: 14965
Пользователь №: 4190
На форуме: 8 лет, 9 месяцев, 26 дней
Карма: 443




Цитата (McLotos @ 17.11.2016 - 14:28)
Потому-что поле date внезапно имеет тип text (архитектор БД просто молодец)

А изменить тип поля?

И мне кажется, что я понял, что ты хочешь получить - и я думаю, что знаю "как это сделать" smile.gif Зайди вечером ко мне в скайп, уточню кое-чего по этой теме.

Это сообщение отредактировал sergeiss - 17.11.2016 - 17:39


--------------------
* Хэлп по PHP
* Описалово по JavaScript
* Хэлп и СУБД для PostgreSQL

* Обучаю PHP, JS, вёрстке. Интерактивно и качественно. За разумные деньги.

* "накапливаю умение телепатии" (С) и "гуглю за ваш счет" (С)

user posted image
PMICQ
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
McLotos  
 ۩  Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



武士道
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 1225
Пользователь №: 28342
На форуме: 5 лет, 5 месяцев, 20 дней
Карма: 28




Цитата (sergeiss @ 17.11.2016 - 19:35)
А изменить тип поля?

2млрд боевых записей


--------------------
программирование - инструмент для решения конкретных задач, любая попытка спроектировать что-то универсальное приведет к провалу.©paul85
В любом случае тебе прийдётся пройти путь изобретения велосипеда, который прошли другие, только причиной твоего изобретения будет непонимание принципов работы велосипеда изобретённого другими людьми.©SlavaFr
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
sergeiss  
Дата
Цитировать сообщение

Пользователь сейчас на форуме



Сидел он, дум великих полон - и вдаль глядел
******

Профиль
Группа: Эксперт
Группа переписки
Сообщений: 14965
Пользователь №: 4190
На форуме: 8 лет, 9 месяцев, 26 дней
Карма: 443




Цитата (McLotos @ 17.11.2016 - 21:07)
2млрд боевых записей

В одной таблице? *смайлик с дёргающимся глазом*
Партиции хотя бы есть?

Да и мне кажется, что лучше один раз отмучиться с изменением типа поля, чем каждый раз мучиться при выборке данных smile.gif


--------------------
* Хэлп по PHP
* Описалово по JavaScript
* Хэлп и СУБД для PostgreSQL

* Обучаю PHP, JS, вёрстке. Интерактивно и качественно. За разумные деньги.

* "накапливаю умение телепатии" (С) и "гуглю за ваш счет" (С)

user posted image
PMICQ
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
S.Chushkin  
[x] Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Пофигист
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 777
Пользователь №: 36058
На форуме: 3 года, 11 месяцев, 6 дней
Карма: 40




Цитата (McLotos @ 16.11.2016 - 08:09)
Теперь к каждой полученной строке...

Я был невнимателен. :(
Есть два решения:
1) объединить на стороне клиента (предпочтительно)
2) через JOIN (если действительно надо)

С первым понятно, я надеюсь.
Второй делается примерно так:
select t1.*, t2.*
from (
SELECT COUNT(DISTINCT(`idLoan`)) as `count`,
MONTH(STR_TO_DATE(`date`, '%d.%m.%Y')) as `month`,
YEAR(STR_TO_DATE(`date`, '%d.%m.%Y')) as `year`
FROM `main`
WHERE `idLoan`>0
AND YEAR(STR_TO_DATE(`date`, '%d.%m.%Y')) = YEAR(CURDATE())
GROUP BY `month`, `year`
ORDER BY `year`, `month`
) t1
left join (select
(SELECT COUNT(DISTINCT `idLoan`)
FROM `main`
WHERE `idLoan`>0
AND YEAR(STR_TO_DATE(`date`, '%d.%m.%Y')) = YEAR(CURDATE())
AND `answer` IN (1,2)) a1,
(
SELECT COUNT(DISTINCT(`idLoan`))
FROM `main`
WHERE `idLoan`>0
AND YEAR(STR_TO_DATE(`date`, '%d.%m.%Y')) = YEAR(CURDATE())
AND `answer`=2) a2,
(
SELECT COUNT(DISTINCT(`idLoan`))
FROM `request`
WHERE `status`='18'
AND `archive`='1') `accepted`
) t2 on true


п.с. Надеюсь, теперь правильно понял что хотелось ТС-у.


--------------------
PM
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
S.Chushkin  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Пофигист
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 777
Пользователь №: 36058
На форуме: 3 года, 11 месяцев, 6 дней
Карма: 40




Цитата (sergeiss @ 17.11.2016 - 21:22)
Цитата (McLotos @ 17.11.2016 - 21:07)
2млрд боевых записей

...Да и мне кажется, что лучше один раз отмучиться с изменением типа поля, чем каждый раз мучиться при выборке данных smile.gif

Присоединяюсь.
(-) Несколько часов работы движка
(+) таблица будет на 8Г меньше
(+) нагрузка на сервер меньше
т.к. YEAR(`date`) быстрее, чем YEAR(STR_TO_DATE(`date`, '%d.%m.%Y')) на 15-20%


--------------------
PM
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
McLotos  
 ۩  Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



武士道
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 1225
Пользователь №: 28342
На форуме: 5 лет, 5 месяцев, 20 дней
Карма: 28




S.Chushkin
Запрос почти делает то что нужно, но все-таки не то. Запрос выводит одинаковые а1,а2 и accepted для всех строк, а в идеале (чего я как раз никак не мог добиться) выводить для каждого месяца свои значения


--------------------
программирование - инструмент для решения конкретных задач, любая попытка спроектировать что-то универсальное приведет к провалу.©paul85
В любом случае тебе прийдётся пройти путь изобретения велосипеда, который прошли другие, только причиной твоего изобретения будет непонимание принципов работы велосипеда изобретённого другими людьми.©SlavaFr
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
sergeiss  
Дата
Цитировать сообщение

Пользователь сейчас на форуме



Сидел он, дум великих полон - и вдаль глядел
******

Профиль
Группа: Эксперт
Группа переписки
Сообщений: 14965
Пользователь №: 4190
На форуме: 8 лет, 9 месяцев, 26 дней
Карма: 443




McLotos, я не буду мучать твой запрос, но я напишу общую схему того, что тебе нужно сделать - исходя из того, как я понял задачу.
Суть этого абстрактного запроса: выбрать данные из table1 и привязать к ним подсчет какой-то хрени. Один подсчет делается из table2, а в другом идет завязка на ту же самую таблицу. "Соль" тут именно в связи основной выборки и подзапросов.
Но всё-таки подумай насчет изменения типа поля - и в запросах удобнее будет, и быстрее они будут работать.
select 
id,
field1,
field2,
(
select count(*) from table2 where id = t1.id and CONDITION2 ) as count_id,
(
select count(*) from table1 where param = t1.param2 and CONDITION3) as count_param
from table1 t1
where CONDITION


--------------------
* Хэлп по PHP
* Описалово по JavaScript
* Хэлп и СУБД для PostgreSQL

* Обучаю PHP, JS, вёрстке. Интерактивно и качественно. За разумные деньги.

* "накапливаю умение телепатии" (С) и "гуглю за ваш счет" (С)

user posted image
PMICQ
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
S.Chushkin  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Пофигист
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 777
Пользователь №: 36058
На форуме: 3 года, 11 месяцев, 6 дней
Карма: 40




Цитата (McLotos @ 18.11.2016 - 07:48)
S.Chushkin
Запрос почти делает то что нужно, но все-таки не то. Запрос выводит одинаковые а1,а2 и accepted для всех строк, а в идеале (чего я как раз никак не мог добиться) выводить для каждого месяца свои значения

Как обычно, - какой вопрос, такой ответ. wink.gif
Если вопрос про сферического коня, то и ответ будет о сферическом коне.

Опиши чётко/точно, что ты хочешь получить, т.е. приведи нужные тебе правила и, возможно, получишь точный ответ.


--------------------
PM
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
McLotos  
 ۩  Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



武士道
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 1225
Пользователь №: 28342
На форуме: 5 лет, 5 месяцев, 20 дней
Карма: 28




Цитата (S.Chushkin @ 18.11.2016 - 14:21)
Опиши чётко/точно, что ты хочешь получить, т.е. приведи нужные тебе правила и, возможно, получишь точный ответ.

Перечитай мой первый топик. с какой фразы он стал на китайском?


--------------------
программирование - инструмент для решения конкретных задач, любая попытка спроектировать что-то универсальное приведет к провалу.©paul85
В любом случае тебе прийдётся пройти путь изобретения велосипеда, который прошли другие, только причиной твоего изобретения будет непонимание принципов работы велосипеда изобретённого другими людьми.©SlavaFr
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
  Быстрый ответ
Информация о Госте
Введите Ваше имя
Кнопки кодов
Для вставки цитаты, выделите нужный текст и
НАЖМИТЕ СЮДА
Введите сообщение
Смайлики
:huh:  :o  ;) 
:P  :D  :lol: 
B)  :rolleyes:  <_< 
:)  :angry:  :( 
:unsure:  :blink:  :ph34r: 
     
Показать всё

Опции сообщения  Включить смайлики?
 Включить подпись?
 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:

Опции темы Ответ в темуСоздание новой темыСоздание опроса