これは私のクエリです:
SELECT `p`.`name` AS 'postauthor', `a`.`name` AS 'authorname',
`fr`.`pid`, `fp`.`post_topic` AS 'threadname', `fr`.`reason`
FROM `z_forum_reports` `fr`
LEFT JOIN `forums` `f` ON (`f`.`id` = `fr`.`pid`)
LEFT JOIN `forums` `fp` ON (`f`.`first_post` = `fp`.`id`)
LEFT JOIN `ps` `p` ON (`p`.`id` = `f`.`author_guid`)
LEFT JOIN `ps` `a` ON (`a`.`account_id` = `fr`.`author`)
私の問題は、この左結合です。
SELECT `a`.`name`, `a`.`level`
[..]
LEFT JOIN `ps` `a` ON (`a`.`account_id` = `fr`.`author`)
なぜなら、a
に多くの行があり、私の場合のように返される場合です。
NAME | LEVEL
Test1 | 1
Test2 | 120
Test3 | 2
Test4 | 1
選択してほしいa.name
レベルorder
のdesc
と制限1であるため、上位のlevel
の名前が返されます。ここで(a.account_id = fr.author)
。
あなたが私を手に入れたことを願っています。そうでない場合は、コメントを投稿してください。
交換してみてください:
LEFT JOIN ps a ON a.account_id = fr.author
と:
LEFT JOIN ps a
ON a.PrimaryKey --- the Primary Key of ps
= ( SELECT b.PrimaryKey
FROM ps AS b
WHERE b.account_id = fr.author
ORDER BY b.level DESC
LIMIT 1
)
LEFTJOIN句を次のようなものに置き換えます。
_...
LEFT JOIN (SELECT b.account_id, b.name
FROM (SELECT c.account_id, MAX(c.level) AS level
FROM ps AS c
GROUP BY c.account_id) AS d
JOIN ps AS b ON b.account_id = d.account_id AND b.level = d.level
) AS a
ON (a.account_id = fr.author)
...
_
ps
に同じアカウントIDと同じレベルの行が複数あり、そのレベルが最大レベルであった場合でも、これは複数の行を返します。
_NAME | LEVEL
Test1 | 1
Test2 | 120
Test3 | 2
Test4 | 1
Test5 | 120
_
このような状況が発生する可能性がある場合は、何をしたいかを決定し、クエリを適切に調整する必要があります。たとえば、MAX(b.name)
をGROUPBY句とともに使用して、2つの名前のアルファベット順の後半を任意に選択することができます。