2016-11-04 6 views
0

mysql、test(one)とreview(many)の2つのテーブル。 私の目標:出力クエリ結果をマージし、最適化しますか?

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; 

対応する数の内の1つのレビューから:

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. をそれは私が見つけたのいずれかを選択し、時間を使用することができます感じています結果は2回ありますが、最適化することはできますか?
  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

はい、あなたは1つのSELECTの文とでそれを行うことができます私はここにSQLフィドルを作成している

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 

このクエリ: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

ハハ、私はそれを手に入れます。ありがとう。 –

関連する問題