mysql - 如何将反馈分数整合到搜索结果中

标签 mysql sql database-design

我当前正在运行以下查询,该查询返回一组职位及其类别以及发布者的用户名。

SELECT job_id, user_id, title, profiles.user_name
FROM (jobs)
JOIN profiles ON jobs.user_id = profiles.user_id 
JOIN job_categories ON jobs.cat_id = job_categories.cat_id 
JOIN job_sub_categories ON jobs.sub_cat_id = job_sub_categories.sub_cat_id 
WHERE `status` = 'open' 
ORDER BY post_date desc 
LIMIT 5

我有一个名为反馈的表,其中根据特定雇主之前的交易(很像 eBay)保存特定雇主的反馈行。

feedback_id|employer_id|job_id|performance_score|quality_score|availability_score|communication_score

我想要做的是根据雇主当前的反馈评级对结果进行排序和过滤,但我不知道如何将其添加到我的查询中。看来我必须在查询中做一些数学运算或者运行子查询?或者我应该修改我的反馈表以包含另一个字段,例如针对特定评级给出的总反馈?

任何帮助将不胜感激。

评分的计算方法是将所有反馈分数加在一起除以行数,然后除以数字 4,因为有 4 个评分字段(性能、质量、可用性和沟通),因此 feedback_avg = (feedback_total/num_rows)/4

最佳答案

让我试一下。我假设您只有两个表,雇主:[id,name]反馈:[id,employer_id,score]

首先,分数子查询:

SELECT employer_id, SUM(score) AS total_score, COUNT(*) AS num_rows
       FROM feedback GROUP BY employer_id;

现在主要查询:

SELECT name, total_score/num_rows AS avg_score
       FROM employers JOIN ([subquery]) AS sq ON(employers.id = sq.employer_id)
       WHERE avg_score > 0.5;

将整个子查询粘贴到指定位置。

<小时/>

提示: View

如果您愿意,您可以将子查询设为永久 View ,并在主查询中使用它:

CREATE VIEW score_tally AS
SELECT employer_id, SUM(score) AS total_score, COUNT(*) AS num_rows
       FROM feedback
       GROUP BY employer_id;

SELECT name, total_score/num_rows AS avg_score
       FROM employers JOIN score_tally ON(employers.id = score_tally.employer_id)
       WHERE avg_score > 0.5;
<小时/>

提示(再次):上面的提示很愚蠢,我们应该使用内置的 AVG:

CREATE VIEW score_tally AS
SELECT employer_id, AVG(score) AS avg_score
       FROM feedback
       GROUP BY employer_id;

SELECT name, avg_score
       FROM employers JOIN score_tally ON(employers.id = score_tally.employer_id)
       WHERE avg_score > 0.5;
<小时/>

让我们猜猜您的完整查询可能是什么样子:

SELECT job_id,
       user_id,
       title,
       profiles.user_name AS user_name,
       avg_score

       FROM jobs
            JOIN profiles ON(jobs.user_id = profiles.user_id)
            JOIN job_categories ON(jobs.cat_id = job_categories.cat_id)
            JOIN job_sub_categories ON(jobs.sub_cat_id = job_sub_categories.sub_cat_id)
            JOIN (SELECT employer_id, AVG(score) AS avg_score FROM feedback GROUP BY employer_id) AS sq
                 ON(employers.id = sq.employer_id)

        WHERE status = 'open' AND avg_score > 0.5

        ORDER BY post_date desc
        LIMIT 5

关于mysql - 如何将反馈分数整合到搜索结果中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6604651/

相关文章:

mysql - CONVERT功能无法正常工作

PHP 面向对象 : how to use a generic MySQL class in other classes

mysql - 将 MySQL 数据库从 latin1 更新为 utf8mb4 : max key length is 767 bytes

sql - 返回多列并按月分组

sql - 如何向文件 : input field in the Foreach loop container SSIS 添加多个文件扩展名

sql - st_intersects 与 st_overlaps

database-design - 数据库模式困境

php - 为什么我在这条线上得到 "Warning: mysql_close(): supplied argument is not a valid MySQL-Link resource"?

sql - 哪个数据库设计更好?

数据库设计 - 为用户存储点的方法