2016-11-04 128 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

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