1

次のクエリがあり、同じ行を複数回繰り返し返しています。

コメントとプロジェクトオブジェクトの2つのテーブルを結合する必要がありますが、どちらの方法を試しても、行は複数回繰り返されます。

現在のクエリは次のとおりです。

SELECT 
acx_comments.created_on AS 'Time',
acx_project_objects.created_by_id AS `Created By`,  
acx_comments.body AS `Comment`,
concat("http://www.example.com/projects/" , acx_project_objects.project_id , "/tasks/" , acx_project_objects.integer_field_1 ) AS URL
FROM acx_comments, acx_project_objects
LEFT JOIN acx_comments v
ON v.parent_id = acx_project_objects.id 
WHERE acx_comments.id > 1500 AND acx_comments.id <= 1575
ORDER BY acx_comments.created_on DESC

現在の結果は次のようになります。

時間/作成者/コメント/URL

15:35:34/1/テストコメントX/URLx

15:35:34/1/テストコメントX/URLx

15:35:34/1/テストコメントX/URLx

15:35:34/1/テストコメントX/URLx

15:35:34/1/テストコメントX/URLx

15:35:34/1/テストコメントX/URLx

15:35:34/1/テストコメントX/URLx

ご覧のとおり、同じコメントを複数回印刷しています。

これは、acx_comments.parent_idがacx_project_objects.idに接続するときに多くの重複があるためです。各親は複数のコメントを持つことができるため、同じ親IDを持つコメントが多数あります...しかし、私はコメントを日付順に1回印刷したい。

各コメントを1回だけ印刷するために使用する正しいJoinメソッドがわかりません。上記のコードは、日付順に並べられたコメントのリストを表示していません(一意のみ)。

私はこれに何時間も費やし、解決策を理解できないので、アドバイスをいただければ幸いです。

ありがとうございました!

ところで-URLアドレスを作成する必要があるため、プロジェクトオブジェクトテーブルを使用する必要があります(concat関数を参照)。あなたが私がそのテーブルを削除するべきだと思っている場合-それは不可能です

4

2 に答える 2

2
FROM acx_comments, acx_project_objects
LEFT JOIN acx_comments v
ON v.parent_id = acx_project_objects.id 

技術的にはacx_commentsに対して2回参加しています。WHERE句にはJOIN条件が含まれておらず、ON句のJOIN条件は、LEFTJOINで指定された「acx_commentsv」にのみ適用されます。

何が起こっているかについての私の推測では、acx_commentsとacx_project_objectsの間にデカルト積を作成していると思います。これは、WHEREでJOIN条件なしでコンマ区切りされているためです。次に、acx_commentsを再び混乱させることに参加します。

FROMとLEFTJOINを書き直して、各テーブルが1回だけリストされるようにして、試してみてください。

SELECT 
v.created_on AS 'Time',
o.created_by_id AS `Created By`,  
v.body AS `Comment`,
concat("http://www.example.com/projects/" , o.project_id , "/tasks/" , o.integer_field_1 ) AS URL
FROM acx_comments v
LEFT JOIN acx_project_objects o
ON v.parent_id = o.id 
WHERE v.id > 1500 AND v.id <= 1575
ORDER BY v.created_on DESC
于 2013-03-17T03:12:48.860 に答える
1

GROUP BYコメントIDでMySQLを使用してみることができます。

SELECT 
  acx_comments.created_on 'Time',
  acx_project_objects.created_by_id 'Created By',  
  acx_comments.body 'Comment',
  concat("http://www.example.com/projects/" , acx_project_objects.project_id , "/tasks/" , acx_project_objects.integer_field_1 ) 'URL'
FROM acx_comments, acx_project_objects
LEFT JOIN acx_comments v ON v.parent_id = acx_project_objects.id 
WHERE acx_comments.id > 1500 AND acx_comments.id <= 1575
GROUP BY acx_comments.id
ORDER BY acx_comments.created_on DESC
于 2013-03-17T03:16:03.410 に答える