2014-09-03 2 views
0

Я искал в течение 3-х дней для решения этого попытались десятки запросов и никто не работал до сих пор ... :(Присоединяйтесь 2 таблицы MySQL с различной информацией в одном запросе

У меня есть таблица users и я я список пользователей, что там есть Колум user_type = 2

до сих пор так хорошо ...

Тогда у меня есть таблица feedback, и я хочу поставить в одном запросе список пользователей и среднюю обратную связь, что каждый из тех, пользователи (зная, что некоторые пользователи не имеют обратной связи и, следовательно, даже не перечислены в feedbac k таблица).

Единственный вопрос, который вернулся что-то до сих пор был один:

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 или около того. Проблема в том, что результатом является только одна компания (первый из списка, когда я перечисляю только компании), но это даже не компания, которая имеет обратную связь, поэтому столбец «рейтинг» затем присваивается неправильной компании.

SOOO ... после всего этого беспорядка, я надеюсь, что кто-то поймет, что я ищу и могу мне помочь. :)

EDIT1

Моя users таблица имеет следующие поля: user_id, COMPANY_NAME, post_code, about_company

Моя feedback таблица имеет следующие поля: feedback_id, job_id, VENDOR_ID (такие же, как user_id на пользователей таблицы), рейтинг

EDIT2

Хорошо, я пытался сохранить это просто! Мои таблицы имеют LOT больше полей, чем эти, и мой запрос на самом деле намного более сложный, поскольку он вычисляет расстояние с учетом широты и долготы. Вот РЕАЛЬНЫЙ запрос:

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 

ответ

2

Похоже, что вам нужно левое внешнее соединение. Я предполагаю, что ваша схема выглядит примерно так:

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 

мог бы хотеть бросить COALESCE туда, чтобы вернуть ноль против нуля

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 и добавление GROUP BY для использования функции AVG()

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 
+0

Прежде всего, я благодарю вас так много для быстрого ответа, но, к сожалению, ваш запрос не работает для меня. :( – Pedro

+0

Можете ли вы опубликовать свои заявления о создании таблицы? – jbrahy

+0

Там было несколько полуколонок, которых не должно было быть. Попробуйте еще раз. – jbrahy