2016-11-04 81 views
0

mysql,两个表:测试(一)和评论(很多)。 我的目标:从审查一个在相应的数字合并查询结果,优化?

SELECT t.ID,t.TITLE,COALESCE(COUNT(r.ID),0) `count` 
FROM `test` t 
LEFT OUTER JOIN review r 
    ON t.ID = r.REVIEW_OBJ_ID 
WHERE r.REVIEW_TYPE = '4' 
ORDER BY `count` DESC; 

输出:

ID         TITLE  count 
402884f657e0a6d20157e0a82cc90000 brother 2 

测试表(数据的一小部分)

SELECT t.ID,t.TITLE 
FROM `test` t; 

输出:

ID         TITLE 
40284c8157ad8e7d0157ad8f86880000 123456789
402884f657e0a6d20157e0a82cc90000 brother 
402884f657e0a6d20157e11967a20036 fg 
402884f657e51eff0157e54cd8610004 AAA 
402884f657e652fb0157e65642750000 BBB 
0000000057f4dc900157f4ea9edd0000 VVV 
00000000580065c5015800746d750000 CCC 
00000000580065c501581d9f04f0000b TTT 

而我希望得到这样的:

ID         TITLE      count 
402884f657e0a6d20157e0a82cc90000 brother     2 
402884f657e652fb0157e65642750000 BBB      0 
00000000580065c501581d9f04f0000b TTT      0 
402884f657e0a6d20157e11967a20036 fg       0 
0000000057f4dc900157f4ea9edd0000 VVV      0 
40284c8157ad8e7d0157ad8f86880000 123456789
402884f657e51eff0157e54cd8610004 AAA      0 
00000000580065c5015800746d750000 CCC      0 

所以,我想这和它的工作:

SELECT t.ID,t.TITLE, COALESCE(r.c,0) `count` 
FROM `test` t 
LEFT OUTER JOIN 
(
    SELECT r.REVIEW_OBJ_ID obj_id, COUNT(r.ID) c 
    FROM review r,`test` t 
    WHERE r.REVIEW_TYPE = '4' 
     AND t.ID = r.REVIEW_OBJ_ID 
) r ON r.obj_id = t.ID 
ORDER BY `count` DESC; 

但我有两个问题:

  1. 我感觉我可以使用一次性的选择找到输出结果,但我使用两次select.Can我优化它?
  2. 在测试表字段中添加一个count(冗余),无论是更好的选择。

/评论类型和REVIEW_OBJ_ID决定哪些对象进行审查,就像我使用“评论类型=‘4’”联系test表/

drop table if exists user_doctor_review; 
create table review 
(
    ID     varchar(64) not null, 
    USER_ID    varchar(64), 
    DOCTOR_ID   varchar(64), 
    REVIEW_TYPE   varchar(1), 
    REVIEW_OBJ_ID  varchar(64), 
    SERVICE_SCORE  int(6), 
    REVIEW_CONTENT  varchar(600), 
    REVIEW_TIME   datetime, 
    POID     varchar(64), 
    IS_ANONYMITY   varchar(1), 
    CHECKED_STATUS  varchar(1), 
    STATUS    varchar(1), 
    REPLY_CONTENT  varchar(600), 
    REPLY_TIME   datetime, 
    DOCTOR_IS_READ  varchar(1), 
    primary key (ID) 
); 
+0

你可以分享喜欢的是你的review_obj_id表的结构? –

+0

我不知道我是否明确表示 –

回答

0

是的,你可以用一个SELECT语句做此查询

SELECT test.ID, test.TITLE, count(review.ID) as count from test 
left join review on test.ID = review.REVIEW_OBJ_ID 
where review.REVIEW_TYPE = 4 or review.ID is null 
group by test.ID 

我创建了一个SQL小提琴这里:http://sqlfiddle.com/#!9/c6a178/15

说明: 的关键点是:

or review.ID is null 

因为它会使查询列表中没有的评论测试和

group by test.ID 

这将得到正确的复习计数与测试。

结果:

ID         TITLE      count 
-------------------------------- ------------------------- ----- 
0000000057f4dc900157f4ea9edd0000 VVV       0 
00000000580065c5015800746d750000 CCC       0 
00000000580065c501581d9f04f0000b TTT       1 
40284c8157ad8e7d0157ad8f86880000 123456789
402884f657e0a6d20157e0a82cc90000 brother      2 
402884f657e0a6d20157e11967a20036 fg       0 
402884f657e51eff0157e54cd8610004 AAA       0 
402884f657e652fb0157e65642750000 BBB       0 
+0

哈哈,我明白了。谢谢。 –