powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Как строить подобный запрос.
12 сообщений из 12, страница 1 из 1
Как строить подобный запрос.
    #38636899
mimi22
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
SELECT COUNT(id) AS count
            FROM lessons l
            WHERE date >= :date
                    AND (
                        (teacher_id=:user_id OR student_id=:user_id) AND status = 1
                        OR (
                            (status = 3 AND teacher_id = :user_id AND accepted_t IS NULL)
                            OR (status = 5 AND
                                    ((student_id = :user_id AND accepted_t IS NOT NULL AND accepted_s IS NULL)
                                    OR (teacher_id = :user_id AND accepted_s IS NOT NULL AND accepted_t IS NULL)))
                        )
                        OR (
                            (status = 3 AND student_id = :user_id AND accepted_t IS NULL)
                            OR (status = 5 AND
                                    ((student_id = :user_id AND accepted_s IS NOT NULL AND accepted_t IS NULL)
                                    OR (teacher_id = :user_id AND accepted_t IS NOT NULL AND accepted_s IS NULL)))
                        )
                    )
GROUP BY status


Я бы хотел в итоге получить данные количество найденных данных по каждому отдельному условию.
то есть с условием
Код: sql
1.
(teacher_id=:user_id OR student_id=:user_id) AND status = 1

столько то данных, со условием
Код: sql
1.
2.
3.
4.
5.
(status = 3 AND student_id = :user_id AND accepted_t IS NULL)
                            OR (status = 5 AND
                                    ((student_id = :user_id AND accepted_s IS NOT NULL AND accepted_t IS NULL)
                                    OR (teacher_id = :user_id AND accepted_t IS NOT NULL AND accepted_s IS NULL)))
                        )


столько то данных. Группировать не получается из за того что почти все поля одинакоые на вызоде и как видите по статусу тоже нельзя.
...
Рейтинг: 0 / 0
Как строить подобный запрос.
    #38636983
alex564657498765453
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mimi22,

отвечаю

Код: sql
1.
select count(*) from table where CLAUSE1 and CLAUSE2 OR CLAUSE3 and CLAUSE4



Хочу отдельно по слувиям разделённых ИЛИ

Код: sql
1.
2.
3.
select count(*) table where CLAUSE1 and CLAUSE2
UNION ALL
select count(*) from table where CLAUSE3 and CLAUSE4
...
Рейтинг: 0 / 0
Как строить подобный запрос.
    #38636996
alex564657498765453
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alex564657498765453,


можно за один проход конечно и пойти по принципу
Код: sql
1.
2.
3.
4.
select IF(clause1 and clause2,'pervoe',
            IF(clause3 and clause4,'vtoroe','etogo ne moshet bit')) as 'clause_number',count(*) 
from table 
group by `clause_number`
...
Рейтинг: 0 / 0
Как строить подобный запрос.
    #38636997
alex564657498765453
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: sql
1.
2.
3.
4.
5.
6.
7.
select IF(clause1 and clause2,'pervoe',
            IF(clause3 and clause4,'vtoroe','etogo ne moshet bit')) as 'clause_number',count(*) 
from table 
where
clause1 and clause2 OR
clause3 and clause4
group by `clause_number`
...
Рейтинг: 0 / 0
Как строить подобный запрос.
    #38637012
mimi22
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alex564657498765453,

я думал над этим, но пожирать память будет это.
...
Рейтинг: 0 / 0
Как строить подобный запрос.
    #38637026
mimi22
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alex564657498765453
Код: sql
1.
2.
3.
4.
5.
6.
7.
select IF(clause1 and clause2,'pervoe',
            IF(clause3 and clause4,'vtoroe','etogo ne moshet bit')) as 'clause_number',count(*) 
from table 
where
clause1 and clause2 OR
clause3 and clause4
group by `clause_number`



вот над этим я думал и это будет жрать память
...
Рейтинг: 0 / 0
Как строить подобный запрос.
    #38637121
Cygapb-007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я бы условие по-другому записал:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
WHERE DATE >= :date 
  AND (
      STATUS = 1 AND :user_id IN (teacher_id, student_id)
  OR (STATUS = 3 AND accepted_t IS NULL AND :user_id = teacher_id OR 
      STATUS = 5 AND accepted_t IS NOT NULL AND accepted_s IS NULL AND :user_id IN (student_id,teacher_id))
  OR (STATUS = 3 AND accepted_t IS NULL AND :user_id = student_id OR 
      STATUS = 5 AND accepted_s IS NOT NULL AND accepted_t IS NULL AND :user_id IN (student_id,teacher_id))
  )
...
Рейтинг: 0 / 0
Как строить подобный запрос.
    #38637133
Cygapb-007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
наврал, сорь :(
...
Рейтинг: 0 / 0
Как строить подобный запрос.
    #38637147
Cygapb-007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mimi22Я бы хотел в итоге получить данные количество найденных данных по каждому отдельному условию.
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
SELECT
  SUM( STATUS = 1 AND (teacher_id = :user_id OR student_id = :user_id)) AS Qty1,
  SUM((STATUS = 3 AND accepted_t IS NULL AND teacher_id = :user_id) OR 
      (STATUS = 5 AND (
        (accepted_t IS NOT NULL AND accepted_s IS NULL     AND student_id = :user_id) OR 
        (accepted_t IS NULL     AND accepted_s IS NOT NULL AND teacher_id = :user_id)))) AS Qty2,
  SUM((STATUS = 3 AND accepted_t IS NULL AND student_id = :user_id) OR 
      (STATUS = 5 AND (
        (accepted_t IS NOT NULL AND accepted_s IS NULL     AND teacher_id = :user_id) OR 
        (accepted_t IS NULL     AND accepted_s IS NOT NULL AND student_id = :user_id)))) AS Qty3,
  COUNT(*) AS Total
WHERE DATE >= :date 
AND (
     STATUS = 1 AND (teacher_id = :user_id OR student_id = :user_id) 
  OR(
    (STATUS = 3 AND accepted_t IS NULL AND teacher_id = :user_id) OR 
    (STATUS = 5 AND (
      (accepted_t IS NOT NULL AND accepted_s IS NULL     AND student_id = :user_id) OR 
      (accepted_t IS NULL     AND accepted_s IS NOT NULL AND teacher_id = :user_id)))) 
  OR(
    (STATUS = 3 AND accepted_t IS NULL AND student_id = :user_id) OR 
    (STATUS = 5 AND (
      (accepted_t IS NOT NULL AND accepted_s IS NULL     AND teacher_id = :user_id) OR 
      (accepted_t IS NULL     AND accepted_s IS NOT NULL AND student_id = :user_id))))
  )
...
Рейтинг: 0 / 0
Как строить подобный запрос.
    #38637170
alex564657498765453
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cygapb-007mimi22Я бы хотел в итоге получить данные количество найденных данных по каждому отдельному условию.
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
SELECT
  SUM( STATUS = 1 AND (teacher_id = :user_id OR student_id = :user_id)) AS Qty1,
  SUM((STATUS = 3 AND accepted_t IS NULL AND teacher_id = :user_id) OR 
      (STATUS = 5 AND (
        (accepted_t IS NOT NULL AND accepted_s IS NULL     AND student_id = :user_id) OR 
        (accepted_t IS NULL     AND accepted_s IS NOT NULL AND teacher_id = :user_id)))) AS Qty2,
  SUM((STATUS = 3 AND accepted_t IS NULL AND student_id = :user_id) OR 
      (STATUS = 5 AND (
        (accepted_t IS NOT NULL AND accepted_s IS NULL     AND teacher_id = :user_id) OR 
        (accepted_t IS NULL     AND accepted_s IS NOT NULL AND student_id = :user_id)))) AS Qty3,
  COUNT(*) AS Total
WHERE DATE >= :date 
AND (
     STATUS = 1 AND (teacher_id = :user_id OR student_id = :user_id) 
  OR(
    (STATUS = 3 AND accepted_t IS NULL AND teacher_id = :user_id) OR 
    (STATUS = 5 AND (
      (accepted_t IS NOT NULL AND accepted_s IS NULL     AND student_id = :user_id) OR 
      (accepted_t IS NULL     AND accepted_s IS NOT NULL AND teacher_id = :user_id)))) 
  OR(
    (STATUS = 3 AND accepted_t IS NULL AND student_id = :user_id) OR 
    (STATUS = 5 AND (
      (accepted_t IS NOT NULL AND accepted_s IS NULL     AND teacher_id = :user_id) OR 
      (accepted_t IS NULL     AND accepted_s IS NOT NULL AND student_id = :user_id))))
  )



да ему только юнион подойдёт, он же не хочет чтобы память жрало, а любая агрегация, это вычитывание значений ... единственный способ избежать это чтобы вселекте был только каунт звезда.
...
Рейтинг: 0 / 0
Как строить подобный запрос.
    #38637236
Cygapb-007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alex564657498765453да ему только юнион подойдёт, он же не хочет чтобы память жрало, а любая агрегация, это вычитывание значений ... единственный способ избежать это чтобы вселекте был только каунт звезда.Если считать COUNT(*), то практически не будет накладных расходов для одновременного подсчета SUM. При обработке UNION накладные расходы возрастут кратно числу UNION
...
Рейтинг: 0 / 0
Как строить подобный запрос.
    #38637238
Cygapb-007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А, я не понял сразу, о чем речь.

Компилятор SQL (MS SQL, во всяком случае) иногда "сходит с ума" пытаясь найти оптимальный план с OR в фильтре. Иногда при разбиении запроса на более простые (без OR) время выполнения и количество "перелопаченных" данных уменьшается многократно.

Так что, ятд, нужно смотреть на конкретных данных, какой запрос будет обработан более оптимальным образом.
...
Рейтинг: 0 / 0
12 сообщений из 12, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Как строить подобный запрос.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]