わかりましたので、私はこのクエリに取り組んできましたが、ステートメントを相互にネストする現在の方法よりも、より良い方法が必要であると確信しています。
これが私の2つのメインテーブルです(すぐに書き直したので、完全な「テーブル作成」コードではない可能性があります)
CREATE TABLE `person` (
`personid` INT PRIMARY KEY AUTO_INCREMENT,
`personuuid` VARCHAR(64),
`flags` INT,
`last_updated` DATETIME,
`first_name` VARCHAR(64),
`last_name` VARCHAR(64)
);
CREATE TABLE `person_status` (
`person_statusid` INT PRIMARY KEY AUTO_INCREMENT,
`person_statusesid` INT,
`personuuid` VARCHAR(64),
`groupsuuid` VARCHAR(64),
`start_date` DATE
);
簡単な説明: ご覧のとおり、個人は (潜在的に) 複数のステータスを持つことができます。最新のステータスは、開始日 (開始日が最も長い方) によって決定されます。各人物は、個人テーブル内に複数のエントリを持つ可能性もあります。(ユーザー情報の更新を追跡するのに役立ちます) 最新の情報は、最新の last_updated 値を持つ情報です。
私がやろうとしていること: 次のようなすべての人 (別名 personuuid) のリストを取得しようとしています:
- 私たちに戻ってくるエントリには、最新の人のステータスがあります
- ステータスは、特定の groupsuuid に対してのみ表示されます (別名、グループによってフィルター処理されます)。
- 名前がフィルタリングされるように、追加のフィルタリングも必要です
- flags が 0 であることも確認する必要があります。
私が実行しているクエリは次のとおりです。
SELECT personuuid FROM (
SELECT personuuid, flags FROM (
SELECT DISTINCT personuuid, flags
FROM person
JOIN (
SELECT personuuid, t2.person_statusesid FROM (
SELECT personuuid, groupsuuid, t1.person_statusesid FROM (
SELECT personuuid, groupsuuid, p1.person_statusesid
FROM person_status as p1
ORDER BY start_date DESC, person_statusid DESC
) as t1
GROUP BY personuuid, groupsuuid
) as t2
WHERE groupsuuid='xxxxxxxxxx' AND person_statusesid = X
) AS t3 USING (personuuid)
WHERE (first_name LIKE '%TEST%' OR last_name LIKE '%TEST%')
ORDER BY person_statusesid, last_name, first_name, last_updated DESC
) as t4
GROUP BY personuuid
) as t5
WHERE flags <> 2;
ご覧のとおり、私が行っていることは、個人のステータスを並べ替え、グループと statusesid でフィルター処理するテーブルと個人テーブルを結合することです。次に、結合された 2 つのテーブルを名前でフィルタリングして取得し、最新の人物の行を取得して、適切なフラグが設定されていることを確認します。
これは楽しいパズルのように思えるので、誰かが適切な解決策を思い付くことができるかどうかを確認してもらいたいと思いました. 私はこれらのことの専門家ではないので、基本的な SQl コマンドしか知らないので、どんなアドバイスでも役に立ちます。ありがとう =)