2015-09-17 3 views
1

Это моя база данных (я ставлю только важные COLS)Как извлечь запрос из трех таблиц

КАТЕГОРИИ (чид, CNAME)

RECORD КАТЕГОРИИ

(1, A) 
(2, B) 
(3, C) 

ПОЛЬЗОВАТЕЛИ (uid, uname, cid);

ЗАПИСИ ПОЛЬЗОВАТЕЛЕЙ

(1, JON, 1) 
(2, NED, 1) 
(3, ROB, 2) 
(4, JAM, 3) 
(5, TYR, 1) 
(6, CAT, 2) 
(7, JOF, 2) 
(8, SAN, 3) 
(9, ARY, 1) 

ЗАКУПКИ (ИДП, UID, цена)

RECORD ЗАКУПКИ

(1, 2, 100) 
(2, 5, 150) 
(3, 1, 300) 
(4, 2, 120) 
(5, 3, 50) 
(6, 3, 210) 
(7, 2, 190) 
(8, 8, 155) 
(9, 9, 111) 
(10, 2, 100) 
(11, 2, 150) 
(12, 1, 310) 
(13, 8, 120) 
(14, 3, 50) 
(15, 7, 210) 
(16, 2, 190) 
(17, 6, 155) 
(18, 4, 111) 

Я хочу, чтобы финальный стол:

FINAL TABLE (cname, total) 

всего: сумма не более 3 значений группы tnum по SECOND.sid.

Это 3 максимальных значения для каждой SECOND строки, которую вы можете получить с помощью команды SELECT FROM table THIRD.

1 -> MAX(300, 310) = 310 
2 -> MAX(100, 120, 190, 100, 150, 190) = 190 
3 -> MAX(210, 50, 50) = 210 
4 -> MAX(111) = 111 
5 -> MAX(150) = 150 
6 -> MAX(155) = 155 
7 -> MAX(210) = 210 
8 -> MAX(155, 120) = 155 
9 -> MAX(111) = 111 

Категория А у пользователя 1, 2, 5 и 9 таким образом, только максимум три макс будет сумма

total1(310) > total2(190) > total5(150) > total9(111). 

Так

A -> total1(310) + total2(190) + total5(150) = 650 

Категория B Пользователя 3, 6 и 7, поэтому все эти три являются правильными:

B -> total3(210) + total6(155) + total7(210) = 575 

Наконец категории C есть пользователь 4 и 8

C-> total4(111) + total8(155) = 266** 

Так что я сделал это подзапрос:

SELECT max(price) tot, u.uid user, p.pid purchase, u.cid category 
FROM purchase p, user u 
WHERE p.uid=u.uid group by user ORDER BY tot DESC LIMIT 3 

Limit 3 не работает, потому что печать первых трех значений.

Это общий запрос:

SELECT c.cname, sum(totalmax.tot) totalsum 

FROM purchases p1, categories c1, users u1, 

(SELECT max(price) tot, u.uid user, p.pid purchase, u.cid category 
FROM purchase p, user u 
WHERE p.uid=u.uid group by user ORDER BY tot DESC LIMIT 3) totalmax 

WHERE totalmax.pid = p1.pid AND u1.cid=c1.cid AND u1.uid=p1.uid 

GROUP BY c1.cnome 

ORDER BY totalsum DESC 

Я пытался сделать это (то есть думать, что я хочу):

AND u.cid = c1.cid 

Но подзапрос не читал f1.fid. Как я могу дать c1.cid для подзапроса?

Спасибо за ответ

+0

Вы действительно используете MySQL и SQL Server здесь? Я задерживаю некоторый SQL, специфичный для продукта, который не будет работать на обоих продуктах ... – jarlh

+0

Нет sqlserver. Я сделал ошибку с тегами –

ответ

1

После того, как вы отредактировали вопрос, я редактировал этот ответ. Запрос, который вы ищете, не является прямым, потому что вам нужен выбор «сверху N в группе».

Это моя быстрая попытка, которая, безусловно, не оптимальна (предложения приветствуются).

select cname, sum(maxp) from(
    (select * from 
     (select c.cname, p.uid, max(price) maxp from purchases p left join users u left join categories c on u.cid = c.cid on p.uid = u.uid group by p.uid) x 
    where x.cname='A' order by maxp desc limit 3) 

union all 

    (select * from 
     (select c.cname, p.uid, max(price) maxp from purchases p left join users u left join categories c on u.cid = c.cid on p.uid = u.uid group by p.uid) x 
    where x.cname='B' order by maxp desc limit 3) 

union all 

    (select * from 
     (select c.cname, p.uid, max(price) maxp from purchases p left join users u left join categories c on u.cid = c.cid on p.uid = u.uid group by p.uid) x 
    where x.cname='C' order by maxp desc limit 3) 
    ) y 

group by cname order by cname 
+0

Этот запрос дает тот же самый экран. Конечно, лучше, потому что я не эксперт с JOIN. –

+0

Проблема в том, что я хочу, чтобы в подзапросе было максимально три максимальных значения для каждого t1.fid. Вы понимаете? –

+0

О, извините, я неправильно понял вопрос. Я могу отредактировать ответ, но сначала мне нужно лучше понять, чего вы хотите достичь. Вы хотите начать с таблицы THREE, рассмотрите 3 самые высокие записи (по tnum) для каждого sid, а затем ...? – Danilo

1
SELECT * INTO #values FROM 
(SELECT sid, max(tnum) as val 
FROM THIRD t 
GROUP BY sid) v 

SELECT f.fname, sum(val) 
FROM 
FIRST f 
INNER JOIN SECOND s 
ON f.fid= s.fid 
INNER JOIN #values v 
ON v.sid=s.sid 
GROUP BY f.fname 

DROP TABLE #values 
+0

Я использую mysql. Что такое SELECT * INTO? Я использую его только в PLSQL –

+0

Можете ли вы создать временную таблицу в mysql? Я пришел сюда после чтения sql-сервера и сначала написал CTE, и когда u отредактировал теги, я удалил с предложением. –

+0

temp-table: создать временную таблицу tmp_values ​​select ... ' – flaschenpost