처음에는 약한 제목을 제공 한 것에 대해 사과드립니다. 나는 그것을 더 나은 방법으로 설명 할 수 없었다.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 |
+----+------------------------+------+----------+-------------------+
질문 : 지금
이 여기 적어도 나를 위해, 까다로운 부분을 온다 . 내 앱 내에서 로그인 여부에 관계없이 레코드를 검색 할 수 있으며 로그인 한 경우 위의 쿼리에 사용자 자신의 평점 값을 포함하고 싶습니다.
세션 값을 읽고 사용자가 로그인했는지 여부를 확인하기 위해 조건부를 실행하고 이에 따라 해당 쿼리를 실행할 수 있다는 것을 알고 있습니다. 나는 위의 쿼리에 특정 사용자의 개인 등급 값을 포함시키는 법을 모른다.
어떻게 할 사용자의 평점을 계산 하시겠습니까? 일치하는 기록의 모든 평점의 '합계'입니까? –
개별 값입니다. 사용자가 레코드를 평가할 때마다이 레코드는'ratings' 테이블 (record_id, user_id 및 실제 속도)에 저장됩니다. –
이 목표는 사용자가 자신의 평가 값을 검토 할 수 있다는 것입니다 키워드를 기반으로 기록하십시오. –