2017-04-20 5 views
1

처음에는 약한 제목을 제공 한 것에 대해 사과드립니다. 나는 그것을 더 나은 방법으로 설명 할 수 없었다.MYSQL - 특정 조건에 따라 여분의 열을 출력합니다.

다음을 고려하십시오. users에 대해 하나, records에 대해 하나, ratings에 대해 하나씩 세 개의 테이블이 있습니다. 테이블은 매우 설명이 필요하지만, 데이터베이스에 대한 스키마는 다음과 같습니다 :

+---------------------+ 
| Tables_in_relations | 
+---------------------+ 
| records    | 
| ratings    | 
| users    | 
+---------------------+ 

records 테이블에 대한 스키마는 다음과 같습니다 :

+----------+----------------------+------+-----+---------+----------------+ 
| Field | Type     | Null | Key | Default | Extra   | 
+----------+----------------------+------+-----+---------+----------------+ 
| id  | smallint(5) unsigned | NO | PRI | NULL | auto_increment | 
| title | varchar(256)   | NO |  | NULL |    | 
| year  | int(4)    | NO |  | NULL |    | 
+----------+----------------------+------+-----+---------+----------------+ 

users 테이블에 대한 스키마는 다음과 같습니다 :

+----------+----------------------+------+-----+---------+----------------+ 
| Field | Type     | Null | Key | Default | Extra   | 
+----------+----------------------+------+-----+---------+----------------+ 
| id  | smallint(5) unsigned | NO | PRI | NULL | auto_increment | 
| email | varchar(256)   | NO |  | NULL |    | 
| name  | varchar(256)   | NO |  | NULL |    | 
| password | varchar(256)   | NO |  | NULL |    | 
+----------+----------------------+------+-----+---------+----------------+ 

ratings 표는 명백하게 record_id 및 user_id와 함께 저장되며 관련성이 있습니다 n 테이블.

이의 스키마는 다음과 같습니다 :

+----------+----------------------+------+-----+---------+----------------+ 
| Field | Type     | Null | Key | Default | Extra   | 
+----------+----------------------+------+-----+---------+----------------+ 
| id  | smallint(5) unsigned | NO | PRI | NULL | auto_increment | 
| record_id| smallint(5) unsigned | NO | MUL | NULL |    | 
| user_id | smallint(5) unsigned | NO | MUL | NULL |    | 
| rating | int(1)    | NO |  | NULL |    | 
+----------+----------------------+------+-----+---------+----------------+ 

지금, 내 응용 프로그램에서 나는 특정 키워드에 따라 기록을 가져 오는 검색 기능을 가지고있다. 출력에는 특정 레코드의 평균 등급과 레코드 당 총 등급이 포함되어야합니다. 이것은 다음의 쿼리에 의해 수행 할 수 있습니다

SELECT re.id, re.title, re.year, ROUND(avg(ra.rating)) as avg_rate, 
COUNT(ra.record_id) as total_times_rated 
FROM records re 
LEFT JOIN ratings ra ON ra.record_id = re.id 
GROUP BY re.id; 

나에게 다음과 같은 출력 줄 것이다 :

+----+------------------------+------+----------+-------------------+ 
| id | title     | year | avg_rate | total_times_rated | 
+----+------------------------+------+----------+-------------------+ 
| 1 | Test Record 1   | 2008 |  3 |     4 | 
| 2 | Test Record 2   | 2012 |  2 |     4 | 
| 3 | Test Record 3   | 2003 |  3 |     4 | 
| 4 | Test Record 4   | 2012 |  3 |     3 | 
| 5 | Test Record 5   | 2003 |  2 |     3 | 
| 6 | Test Record 6   | 2006 |  2 |     3 | 
+----+------------------------+------+----------+-------------------+ 

질문 : 지금

이 여기 적어도 나를 위해, 까다로운 부분을 온다 . 내 앱 내에서 로그인 여부에 관계없이 레코드를 검색 할 수 있으며 로그인 한 경우 위의 쿼리에 사용자 자신의 평점 값을 포함하고 싶습니다.

세션 값을 읽고 사용자가 로그인했는지 여부를 확인하기 위해 조건부를 실행하고 이에 따라 해당 쿼리를 실행할 수 있다는 것을 알고 있습니다. 나는 위의 쿼리에 특정 사용자의 개인 등급 값을 포함시키는 법을 모른다.

+0

어떻게 할 사용자의 평점을 계산 하시겠습니까? 일치하는 기록의 모든 평점의 '합계'입니까? –

+0

개별 값입니다. 사용자가 레코드를 평가할 때마다이 레코드는'ratings' 테이블 (record_id, user_id 및 실제 속도)에 저장됩니다. –

+0

이 목표는 사용자가 자신의 평가 값을 검토 할 수 있다는 것입니다 키워드를 기반으로 기록하십시오. –

답변

0

당신은 열에서 SELECT 쿼리를 추가하여 결과에 사용자의 등급을 추가 할 수 있습니다

SELECT re.id, re.title, re.year, ROUND(avg(ra.rating)) as avg_rate, 
COUNT(ra.record_id) as total_times_rated, 
(SELECT rating FROM ratings WHERE user_id = ? AND record_id = re.id) as user_rating 
FROM records re 
LEFT JOIN ratings ra ON ra.record_id = re.id 
GROUP BY re.id; 

우리는 세션에서 user_id를 얻을 결과에 user_rating 열을 생성하기 위해이 쿼리에 전달할 수 있습니다.

사용자가 레코드를 여러 번 평가할 수 있다고 가정하면 SUM을 사용했습니다. 그렇지 않은 경우 검색어에서 삭제할 수 있습니다.

업데이트

당신은 예를 들어, 당신은 다른 쿼리에 기존 쿼리를 포장 할 수있는 가치를 고려하고 그것에 열을 추가 GROUP BY을하지 않으려면 :

SELECT a.id, a.title, a.year, a.avg_rate, a.total_times_rated, 
(SELECT rating FROM ratings WHERE user_id = ? AND record_id = a.id) as user_rating 
FROM (SELECT re.id as id, re.title as title, re.year as year, ROUND(avg(ra.rating)) as avg_rate, 
COUNT(ra.record_id) as total_times_rated 
FROM records re 
LEFT JOIN ratings ra ON ra.record_id = re.id 
GROUP BY re.id) a; 
+0

그냥 해보려고하면 다음과 같은 오류가 발생합니다 :'ERROR 1242 (21000) : Subquery가 2 행 이상을 반환합니다 .' 사용자가 등급을 매기고 오류를 표시하는 여러 레코드가있을 수 있다고 생각합니다. 예, 사용자가 단일 레코드를 여러 번 평가할 수 없기 때문에 대답에서 'SUM'을 제거한 것입니다. –

+0

쿼리에 하나 이상의 조건을 추가 했습니까? –

+0

글쎄, 이제는 사용자가 레코드를 평가하면 'user_rating'값을, 그렇지 않은 경우에는 'NULL'을 얻습니다. 그러나, 이제는 하나의 레코드에서'total_times_recorded'와'avg_rate'를 가져 와서 이전에 발생하지 않은 모든 레코드에 출력합니다. 이상한 ... –

관련 문제