私は有名人の写真のウェブサイトを持っています。と呼ばれる各写真のすべての検索可能なデータを保持する 1 つのテーブルがあり、データの完全なセットは、photoSearch
、 、 という名前の多くのテーブル (正規化) に分散されます。photos
photoPeople
people
テーブルには写真 ID と人物 ID が含まれphotoPeople
、people
テーブルには人物 ID と人物の名前が含まれます。表には、photos
キャプション、見出し、高さ、幅、ファイル サイズ、販売コードなどが含まれます。
これは、良い結果を生み出す現在のスクリプトです。
SELECT
p.photoID,
p.setID,
p.headline,
p.caption,
GROUP_CONCAT(pe.people ORDER BY pe.people ASC SEPARATOR ';') AS people
FROM
photos p
INNER JOIN
(
SELECT photoID
FROM photoSearch
WHERE MATCH (allKeywords, shortCaption)
AGAINST ('+red +dress +claridges +hotel' IN BOOLEAN MODE)
LIMIT 50
) pids ON p.photoID = pids.photoID
***********
LEFT JOIN
photoPeople pp ON p.photoID = pp.photoID
LEFT JOIN
people pe ON pp.peopleID = pe.peopleID
***********
GROUP BY p.photoID
問題は、有名人の名前を選択して結果に表示するのではなく、1 人以上の有名人の名前を検索して結果を変更したいということです。
同じ列に 2 つ以上の where 句 (where pe.people = 'angelina jolie' および pe.people = 'brad pitt') を追加することはできないと確信しているので、そうする必要があると確信しています。 JOINSを使用して行われます。
これは私を少し混乱させました。だから私はここSOで質問して、これを達成する方法を見つけ、誰かがこれをアドバイスしました:
「'photoPeople' テーブルと 'people' テーブルにn回参加します。ここで、nは検索する人の数です。」
これを達成するためにさまざまな方法を試しましたが、これまでのところ失敗しています。彼が言ったことには、2行のアスタリスク(上記のコード)の間の結合を削除し、それらをpeople テーブルへのn個の結合に置き換えることが含まれていることを知っていますが、私はそれを理解できません.
私はこれを試しましたが、phpMyAdmin はこの 10 分間ずっと考えていました!:
********
JOIN ( photoPeople AS pp1 JOIN people AS p1 ON pp1.peopleID = p1.peopleID)
ON p1.people = 'Brad Pitt'
JOIN ( photoPeople AS pp2 JOIN people AS p2 ON pp2.peopleID = p2.peopleID)
ON p2.people = 'Angelina Jolie'
********
FOREVER を取る上記の試みに加えて、GROUP_CONCAT 関数を変更して複数の結合/エイリアス (p1、p2、p3 など) から結果を取得する方法を理解するのにも苦労しています!
これを正しく機能させるためのアドバイスをお願いします。
テストシナリオ
クエリをそのまま実行すると、次のように表示されます。
Photo: 120030
Set: 8803
Headline: Brad and Angelina arrive at film premiere.
People: Brad Pitt; Angelina Jolie
Photo: 120031
Set: 8803
Headline: Brad and Angelina arrive at film premiere.
People: Angelina Jolie
Photo: 120032
Set: 8803
Headline: Brad and Angelina arrive at film premiere.
People: Brad Pitt
新しいクエリで名前を検索したいので、Angeline Jolie と Brad Pitt を検索すると、次のように表示されます。
Photo: 120030
Set: 8803
Headline: Brad and Angelina arrive at film premiere.
People: Brad Pitt; Angelina Jolie
新しい試み:
エラーはありませんが、0 件の結果が返されました。「フランス」の「ブラッド ピット」と「アンジェリーナ ジョリー」の結果は 1000 件あるはずです。
SELECT
p.photoID,
p.setID,
p.headline,
p.caption,
GROUP_CONCAT(pe.people ORDER BY pe.people ASC SEPARATOR ';') AS people
FROM
photos p
INNER JOIN
(
SELECT photoID
FROM photoSearch
WHERE MATCH (allKeywords, shortCaption)
AGAINST ('+France' IN BOOLEAN MODE)
LIMIT 50
) pids ON p.photoID = pids.photoID
LEFT JOIN
photoPeople pp ON p.photoID = pp.photoID
JOIN
people pe ON pp.peopleID = pe.peopleID
AND (pe.people = 'Angelina Jolie' OR pe.people = 'Brad Pitt')
GROUP BY p.photoID
INNER JOIN セクションを削除してこれを実行すると、Brad と Angelina が一緒にいるかどうかに関係なく、すべての写真が返されますが、これは正しくありません。一緒に必要なだけです。も削除するとOR pe.people = 'Brad Pitt'
、アンジェリーナの写真が正しく返されますが、すべてをリンクすることはできません!