2011-12-03 4 views
4

나는MySQL을 곱하여 하위 쿼리 결과

 
CREATE TABLE IF NOT EXISTS tablename (u_id INT NOT NULL, a_id MEDIUMINT NOT NULL,s_count MEDIUMINT NOT NULL, weighted FLOAT NOT NULL)ENGINE=INNODB; 
INSERT INTO tablename (u_id,a_id,s_count,weighted) VALUES (1,1,17,0.0521472392638),(1,2,80,0.245398773006),(1,3,2,0.00613496932515),(1,4,1,0.00306748466258),(1,5,1,0.00306748466258),(1,6,20,0.0613496932515),(1,7,3,0.00920245398773),(1,8,100,0.306748466258),(1,9,100,0.306748466258),(1,10,2,0.00613496932515),(2,1,1,0.00327868852459),(2,2,1,0.00327868852459),(2,3,100,0.327868852459),(2,4,200,0.655737704918),(2,5,1,0.00327868852459),(2,6,1,0.00327868852459),(2,7,0,0.0),(2,8,0,0.0),(2,9,0,0.0),(2,10,1,0.00327868852459),(3,1,15,0.172413793103),(3,2,40,0.459770114943),(3,3,0,0.0),(3,4,0,0.0),(3,5,0,0.0),(3,6,10,0.114942528736),(3,7,1,0.0114942528736),(3,8,20,0.229885057471),(3,9,0,0.0),(3,10,1,0.0114942528736);

내가하고 싶은 일의 간단한 버전으로 다시 만들 수 있습니다

 
+---------+-----------+------------+------------+ 
| u_id | a_id  | count  | weighted | 
+---------+-----------+------------+------------+ 
|  1 |   1 |   17 | 0.0521472 | 
|  1 |   2 |   80 | 0.245399 | 
|  1 |   3 |   2 | 0.00613497 | 
|  1 |   4 |   1 | 0.00306748 | 
|  1 |   5 |   1 | 0.00306748 | 
|  1 |   6 |   20 | 0.0613497 | 
|  1 |   7 |   3 | 0.00920245 | 
|  1 |   8 |  100 | 0.306748 | 
|  1 |   9 |  100 | 0.306748 | 
|  1 |  10 |   2 | 0.00613497 | 
|  2 |   1 |   1 | 0.00327869 | 
|  2 |   2 |   1 | 0.00327869 | 
|  2 |   3 |  100 | 0.327869 | 
|  2 |   4 |  200 | 0.655738 | 
|  2 |   5 |   1 | 0.00327869 | 
|  2 |   6 |   1 | 0.00327869 | 
|  2 |   7 |   0 |   0 | 
|  2 |   8 |   0 |   0 | 
|  2 |   9 |   0 |   0 | 
|  2 |  10 |   1 | 0.00327869 | 
|  3 |   1 |   15 | 0.172414 | 
|  3 |   2 |   40 | 0.45977 | 
|  3 |   3 |   0 |   0 | 
|  3 |   4 |   0 |   0 | 
|  3 |   5 |   0 |   0 | 
|  3 |   6 |   10 | 0.114943 | 
|  3 |   7 |   1 | 0.0114943 | 
|  3 |   8 |   20 | 0.229885 | 
|  3 |   9 |   0 |   0 | 
|  3 |  10 |   1 | 0.0114943 | 
+---------+-----------+------------+------------+ 

처럼

SELECT u_id, SUM(weighted) as total FROM tablename WHERE a_id IN (1,2,3,4,5,6,7,8,9) GROUP BY u_id ORDER BY total DESC;
외모 데이터의 테이블이

결과를 얻는다.

 
+---------+-------------------+ 
| u_id | total    | 
+---------+-------------------+ 
|  2 | 0.996721301227808 | 
|  1 | 0.993865059688687 | 
|  3 | 0.988505747169256 | 
+---------+-------------------+ 

내가하고 싶은 더 복잡한 버전은 u_id의 수를 기준으로 결과를 무겁게하는 것입니다, 그래서

 
query 1 
SELECT count FROM tablename WHERE u_id = 1

에서 결과를 복용

 
+-----------+------------+ 
| a_id  | count  | 
+-----------+------------+ 
|   1 |   17 | 
|   2 |   80 | 
|   3 |   2 | 
|   4 |   1 | 
|   5 |   1 | 
|   6 |   20 | 
|   7 |   3 | 
|   8 |  100 | 
|   9 |  100 | 
|  10 |   2 | 
+-----------+------------+

것은 다음 될 것이라고 반환 합계를 계산하는 데 사용

+---------+-------------------+ 
| u_id | total    | 
+---------+-------------------+ 
|  1 | 83.15337423  | 
|  3 | 65.05747126  | 
|  2 | 1.704918033  | 
+---------+-------------------+ 

예 : u_id =3 wo로 계산 내가 단일 쿼리로이 작업을 수행 할 수있는 방법

sum(count value from query 1 * weighting value for u_id = 3 for each a_id) 
 
17 * 0.172413793 =2.931034483 
80 * 0.459770115 =36.7816092 
2 * 0   =0 
1 * 0   =0 
1 * 0   =0 
20 * 0.114942529 =2.298850575 
3 * 0.011494253 =0.034482759 
100 * 0.229885057 =22.98850575 
100 * 0   =0 
2 * 0.011494253 =0.022988506 
sums up to    65.05747126 

수행 할 ULD?

답변

3

하위 쿼리를 사용하여이 작업을 수행 할 수 있습니다. 특정 ID의 수를 가져옵니다 쿼리는 다음과 같습니다

SELECT a_id, s_count FROM tablename WHERE u_id = <id> 
당신은 적절한 곱셈을 통해 하위 다음, 기본 테이블에이 하위 쿼리의 결과를 결합 왼쪽과 같이 할 것

:

SELECT u_id, SUM(counts.s_count * tablename.weighted) AS total FROM tablename 
LEFT JOIN (SELECT a_id, s_count FROM tablename WHERE u_id = 1) counts 
    ON tablename.a_id = counts.a_id 
GROUP BY u_id 
+0

안녕 벤, 나는 합계를 계산하고 싶다 | count u_id = 1 * 가중치 u_id = 1 | 카운트 u_id = 1 * 웨이팅 u_id = 2 | 카운트 u_id = 1 * 가중치 u_id = 3 – Ben

+0

당신의 솔루션에 대한 합계를 생각하십니까 | count u_id = 1 * 가중치 u_id = 1 | 카운트 u_id = 2 * 웨이팅 u_id = 2 | count u_id = 3 * weighting u_id = 3? – Ben

+0

@Ben, 죄송합니다. 이전에 귀하의 질문에 대해 오해했습니다. 이제 어떻게 할 지 보여주기 위해 제 대답을 업데이트했습니다. –