나는 이것에 대한 해결책을 찾기 위해 3 일 동안 검색했으며 수십 개의 쿼리를 시도했지만 지금까지 아무것도 작동하지 않았습니다 ... :(
테이블이 users
있고 열이있는 사용자를 나열하고 있습니다.user_type = 2
여태까지는 그런대로 잘됐다...
그런 다음 테이블이 feedback
있고 사용자 목록과 각 사용자가 가지고있는 평균 피드백을 동일한 쿼리에 넣고 싶습니다 (일부 사용자는 피드백이 없으므로 피드백 테이블에도 나열되지 않음).
지금까지 무언가를 반환 한 유일한 쿼리는 다음과 같습니다.
SELECT DISTINCT u.user_id, u.company_name, u.post_code, u.about_company, avg(fd.rating) AS rating FROM users u LEFT JOIN feedback fd ON fd.vendor_id = u.user_id WHERE u.user_type=2 ORDER BY u.user_id ASC
이제 "피드백"테이블에는 현재 피드백이있는 회사가 하나뿐입니다. 그러나이 목록은 user_type = 2 열이있는 모든 사용자를 반환해야합니다. 이는 약 20 개 정도입니다. 문제는 결과가 단 1 개 회사 (내가 회사 만 나열 할 때 목록의 첫 번째)이지만 피드백이있는 회사도 아니므로 "등급"열이 잘못된 회사에 할당된다는 것입니다.
SOOO ...이 모든 혼란 후에도 누군가가 내가 찾고있는 것을 이해하고 나를 도울 수 있기를 바랍니다. :)
편집 1
내 users
테이블에는 user_id, company_name, post_code, about_company 필드가 있습니다.
내 feedback
테이블에는 feedback_id, job_id, vendor_id (테이블 사용자의 user_id와 동일), rating 필드가 있습니다.
EDIT2
좋아, 나는 이것을 간단하게 유지하려고 노력했다! 내 테이블에는 이보다 훨씬 많은 필드가 있으며 위도와 경도를 고려하여 거리를 계산하기 때문에 실제로 쿼리가 훨씬 더 복잡합니다. 다음은 REAL 쿼리입니다.
SELECT DISTINCT u.user_id, u.company_name, u.post_code, u.about_company, coalesce(avg(fd.rating),0) AS rating FROM users u LEFT OUTER JOIN feedback fd ON fd.vendor_id = u.user_id WHERE u.lat!='' AND u.longt!='' AND u.status!=0 AND u.user_type=2 AND SQRT( POW( 69.1 * ( u.lat - 38.7376772 ) , 2 ) + POW( 69.1 * ( -9.1269717 - u.longt ) * COS( u.lat / 57.3 ) , 2 ) ) < 100 ORDER BY u.user_id ASC
왼쪽 외부 조인이 필요한 것 같습니다. 귀하의 스키마가 다음과 같다고 가정합니다.
create table users (user_id int, user_type int);
create table feedback (feedback_id int, user_id int, feedback_value int);
SELECT user_id, avg(feedback_value)
FROM users
LEFT OUTER JOIN feedback USING(user_id)
WHERE users.user_type=2
GROUP BY user_id
0 대 null을 반환하기 위해 거기에 합체를 던지고 싶을 수도 있습니다.
SELECT user_id, coalesce(avg(feedback_value),0) as average_feedback
FROM users
LEFT OUTER JOIN feedback USING(user_id)
WHERE users.user_type=2
GROUP BY user_id
다음은 작동하는 예입니다.
mysql> create database test_pedro;
Query OK, 1 row affected (0.00 sec)
mysql> use test_pedro;
Database changed
mysql> create table users (user_id int, user_type int);
Query OK, 0 rows affected (0.02 sec)
mysql> create table feedback (feedback_id int, user_id int, feedback_value int);
Query OK, 0 rows affected (0.02 sec)
mysql> insert into users values (1,2), (2,2), (3,3);
Query OK, 3 rows affected (0.00 sec)
Records: 3 Duplicates: 0 Warnings: 0
mysql> insert into feedback values (1,1,4), (2,1,19);
Query OK, 2 rows affected (0.00 sec)
Records: 2 Duplicates: 0 Warnings: 0
mysql> SELECT user_id, coalesce(avg(feedback_value),0) as average_feedback
FROM users
LEFT OUTER JOIN feedback USING(user_id)
WHERE users.user_type=2
GROUP BY user_id;
+---------+------------------+
| user_id | average_feedback |
+---------+------------------+
| 1 | 11.5000 |
| 2 | 0.0000 |
+---------+------------------+
2 rows in set (0.00 sec)
mysql>
이것이 예상 된 출력입니까?
다음은 일부 모드로 업데이트 된 쿼리입니다. 특히 DISTINCT를 제거하고 AVG () 함수를 사용하기 위해 GROUP BY를 추가합니다.
SELECT u.user_id,
u.company_name,
u.post_code,
u.about_company,
Coalesce(Avg(fd.rating), 0) AS rating
FROM users u
LEFT OUTER JOIN feedback fd
ON fd.vendor_id = u.user_id
WHERE u.lat != ''
AND u.longt != ''
AND u.status != 0
AND u.user_type = 2
AND Sqrt(Pow( 69.1 * ( u.lat - 38.7376772 ), 2 ) + Pow( 69.1 * ( -9.1269717 - u.longt ) * Cos( u.lat / 57.3 ), 2)) < 100
GROUP BY u.user_id,
u.company_name,
u.post_code,
u.about_company
ORDER BY u.user_id ASC
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다