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]   

> Описание: Хитрый запрос к БД уже несколько часов не даёт мне покоя
Реф
Отправлено: 27 Декабря, 2010 - 00:32:57
Post Id



Частый гость


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


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




Приветствую!

Вот уже довольно долго бьюсь пытаюсь составить запрос. Не буду посвящать во все тонкости и постараюсь предельно упростить задачу.

Имеются 3 таблицы (для простоты). Одна пусть будет users с уникальным полем id. Две другие таблицы (назовём их A и B) содержат некоторое количество записей (каждая запись имеет столбец-связку id с первой таблицей).

Запросом нужно получить сумму сумм записей в таблицах A и B, домноженных на определённые коэффициенты, для каждого из пользователей в users.

Пример (указаны значения id для каждой из записей):
users: 1 2 3 4 5
A: 1 1 2 4 4 4 (пусть для первой таблицы коэффициент 2)
B: 1 3 3 3 (для второй коэффициент 3)

посчитаем для первого пользователя (2 записи в таблице А) * 2 + (1 запись в таблице В) * 3 = 7

результат для каждого пользователя:
id sum
1 7
2 2
3 9
4 6
5 0

В первую очередь интересует решение без использования подзапросов (если таковое вооще существует). Заранее, спасибо.

(Отредактировано автором: 27 Декабря, 2010 - 00:35:12)



-----
Думать надо головой, а не головкой!
 
 Top
OrmaJever
Отправлено: 27 Декабря, 2010 - 00:58:21
Post Id



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


Покинул форум
Сообщений всего: 7540
Дата рег-ции: Янв. 2010  
Откуда: Чернигов


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




Математические действия в любом случае лутше проводить в php.
CODE (SQL):
скопировать код в буфер обмена
  1. SELECT count(a.*) AS count_a, count(b.*) AS count_b FROM a , b, users WHERE a.id = users.id AND b.id = users.id

Попробуйте такой запрос. Хотя я не уверен что будет работать но count_a и count_b должны содержать количесво для таблиц А и Б а их уже переменожать в php


-----
Если вы хотя бы 3-4 раза не решите всё выкинуть и начать заново - вы явно что-то делаете не так.
 
 Top
Реф
Отправлено: 27 Декабря, 2010 - 01:12:29
Post Id



Частый гость


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


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




OrmaJever
Нужно получить количества для каждого id из users. А так мы получим только два числа не понятно для какого id. Добавление users.id и GROUP BY users.id также ничего хорошего не даст.


-----
Думать надо головой, а не головкой!
 
 Top
OrmaJever
Отправлено: 27 Декабря, 2010 - 01:45:46
Post Id



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


Покинул форум
Сообщений всего: 7540
Дата рег-ции: Янв. 2010  
Откуда: Чернигов


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




ага сам понял что чтото не так.
Реф пишет:
Нужно получить количества для каждого id из users.

это для всех пользователей одним запросом или только для одного?
CODE (SQL):
скопировать код в буфер обмена
  1. SELECT count(a.*) AS count_a, count(b.*) AS count_b FROM a , b WHERE a.id = $id AND b.id = $id

ну вот для одного должно работать.


-----
Если вы хотя бы 3-4 раза не решите всё выкинуть и начать заново - вы явно что-то делаете не так.
 
 Top
Реф
Отправлено: 27 Декабря, 2010 - 02:16:52
Post Id



Частый гость


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


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




OrmaJever пишет:
это для всех пользователей одним запросом или только для одного?

для всех, включая тех кто ни разу не попал в A и B, но есть в users.

OrmaJever пишет:
ну вот для одного должно работать.

Для одного тоже не сработает.
CODE (SQL):
скопировать код в буфер обмена
  1. SELECT count(a.id) AS count_a, count(b.id) AS count_b FROM a , b WHERE a.id = 1 AND b.id = 1

вернёт для вышеописанного примера count_a = 2 и count_b = 2. Что не верно.


-----
Думать надо головой, а не головкой!
 
 Top
OrmaJever
Отправлено: 27 Декабря, 2010 - 02:20:00
Post Id



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


Покинул форум
Сообщений всего: 7540
Дата рег-ции: Янв. 2010  
Откуда: Чернигов


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




Реф пишет:
вернёт для вышеописанного примера count_a = 2 и count_b = 2. Что не верно.

а если не id подщитывать? а все поля как я написал. (a.*)


-----
Если вы хотя бы 3-4 раза не решите всё выкинуть и начать заново - вы явно что-то делаете не так.
 
 Top
Реф
Отправлено: 27 Декабря, 2010 - 02:27:10
Post Id



Частый гость


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


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




ругается и пишет:
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '*) AS count_a, count(b.*) AS count_b FROM a , b WHERE a.id = 1 AND b.id = 1' at line 1

* имеет смысл не всех полей, а всех столбцов в таблице. Отсюда и ошибка.


-----
Думать надо головой, а не головкой!
 
 Top
OrmaJever
Отправлено: 27 Декабря, 2010 - 02:29:06
Post Id



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


Покинул форум
Сообщений всего: 7540
Дата рег-ции: Янв. 2010  
Откуда: Чернигов


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




Реф пишет:
'*)

оу может вот так a.count(id). Мелкий бы разрулил ситуацию)


-----
Если вы хотя бы 3-4 раза не решите всё выкинуть и начать заново - вы явно что-то делаете не так.
 
 Top
Реф
Отправлено: 27 Декабря, 2010 - 02:38:33
Post Id



Частый гость


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


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




Радость
Ждём мелкого.


-----
Думать надо головой, а не головкой!
 
 Top
OrmaJever
Отправлено: 27 Декабря, 2010 - 02:40:39
Post Id



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


Покинул форум
Сообщений всего: 7540
Дата рег-ции: Янв. 2010  
Откуда: Чернигов


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




Всё я спать. Но мне кажется что первый запрос какраз и вытянет всё.
CODE (SQL):
скопировать код в буфер обмена
  1. SELECT a.count(*) AS count_a, b.count(*) AS count_b FROM a , b, users WHERE a.id = users.id AND b.id = users.id

Посмотрим что напишет мелкий


-----
Если вы хотя бы 3-4 раза не решите всё выкинуть и начать заново - вы явно что-то делаете не так.
 
 Top
Мелкий Супермодератор
Отправлено: 27 Декабря, 2010 - 10:08:52
Post Id



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


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


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




Да ну вас, такие задачки с утра пораньше Хм
Ничего лучше пары подзапросов не придумывается...


-----
PostgreSQL DBA
 
 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