Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Как написать запрос с подзапросом

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Без описания
ninzzo
Отправлено: 19 Июня, 2019 - 18:47:10
Post Id


Частый гость


Покинул форум
Сообщений всего: 176
Дата рег-ции: Март 2013  


Помог: 0 раз(а)




Есть таблица user_chat

id, user_id, chat_id
1, 1, 123
2, 43, 145
3, 2, 15
4, 55, 66
5, 22, 123
6, 77, 2
7, 1, 33
8, 5. 33


Как мы видим у юзера 1 есть чаты 123 и 33
в чате 123 есть юзер 22
В чате 33 есть юзер 5

Как узнать одним запросом или у пользователя 1 есть общий чат например с 5 ?

-Сначала выборка что бы узнать все chat_id для юзера 1
-Потом для каждого чата делать выборку его пользователей

можно как то одним запросом?
 
 Top
Мелкий Супермодератор
Отправлено: 19 Июня, 2019 - 18:52:23
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




ninzzo пишет:
у пользователя 1 есть общий чат например с 5 ?

something like...
CODE (SQL):
скопировать код в буфер обмена
  1. SELECT chat_id FROM chats WHERE user_id IN (1,5) GROUP BY chat_id HAVING count(*) = 2


или
CODE (SQL):
скопировать код в буфер обмена
  1. (SELECT chat_id FROM chats WHERE user_id = 1)
  2. intersect
  3. (SELECT chat_id FROM chats WHERE user_id = 5)


ну или
CODE (SQL):
скопировать код в буфер обмена
  1. SELECT chat_id FROM chats c1 WHERE user_id = 1 AND EXISTS (SELECT FROM chats c2 WHERE c2.user_id = 5 AND c2.chat_id = c1.chat_id)


-----
PostgreSQL DBA
 
 Top
kirsoldatkin
Отправлено: 22 Мая, 2020 - 09:13:29
Post Id


Новичок


Покинул форум
Сообщений всего: 1
Дата рег-ции: Май 2020  


Помог: 0 раз(а)




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

Пример:
игроки получают уровни в игре, надо выбрать все платежи за период, когда у игрока был 9 уровень.
Есть 2 таблицы Платежи и Уровни, в них поля user_id, time, amount\level соответственно.

CODE (SQL):
скопировать код в буфер обмена
  1. SELECT COUNT(Payments.amount) AS Payments_count, SUM(Payments.amount) AS Gross, DATE_FORMAT(Payments.time, '%d-%m-%Y') AS Payment_time
  2.  
  3. FROM Level_Up
  4.  
  5.     RIGHT JOIN Payments ON Level_Up.user_id = Payments.user_id
  6.  
  7.     WHERE Payments.time >= Level_Up.time AND Level_Up.level IN (SELECT level FROM Level_Up WHERE Level_Up.level = 9)
  8.  
  9.     GROUP BY Payment_time


Возвращает платежи, которые были и на 10 уровне тоже, как избавиться от него - не могу сообразить.
(Добавление)
kirsoldatkin пишет:
Не могу сообразить как решить задачку, подскажите, пожалуйста, каким образом можно выбирать строки исходя из рэнжа динамических дат по доп. условию с фиксированным значением?

Пример:
игроки получают уровни в игре, надо выбрать все платежи за период, когда у игрока был 9 уровень.
Есть 2 таблицы Платежи и Уровни, в них поля user_id, time, amount\level соответственно.

CODE (SQL):
скопировать код в буфер обмена
  1. SELECT COUNT(Payments.amount) AS Payments_count, SUM(Payments.amount) AS Gross, DATE_FORMAT(Payments.time, '%d-%m-%Y') AS Payment_time
  2.  
  3. FROM Level_Up
  4.  
  5.     RIGHT JOIN Payments ON Level_Up.user_id = Payments.user_id
  6.  
  7.     WHERE Payments.time >= Level_Up.time AND Level_Up.level IN (SELECT level FROM Level_Up WHERE Level_Up.level = 9)
  8.  
  9.     GROUP BY Payment_time


Возвращает платежи, которые были и на 10 уровне тоже, как избавиться от него - не могу сообразить.


Поборол:

CODE (SQL):
скопировать код в буфер обмена
  1. SELECT COUNT(Payments.amount) AS Payments_count, SUM(Payments.amount) AS Gross, DATE_FORMAT(Payments.time, '%d-%m-%Y') AS Payment_time
  2. FROM Level_Up
  3.     RIGHT JOIN Payments ON Level_Up.user_id = Payments.user_id
  4.     WHERE Payments.time >= Level_Up.time AND Payments.time < (SELECT time FROM Level_Up WHERE level = 10)
  5.  
  6.     GROUP BY Payment_time


Насколько решение кошерное?

(Отредактировано автором: 22 Мая, 2020 - 09:14:03)

 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« SQL и Архитектура БД »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB