2017-10-10 19 views
0

1月に、複数のデータベースクエリを1つのメガクエリに統合する方法について非常に有益な情報が得られましたが、これはHEREです。1つのサブクエリ内の同じテーブルの2つの列からレコードを選択

サブクエリーの1つを拡張しました。これは、photosテーブルのランダムな写真を選択して、ページに表示されている各プロジェクトごとに表示します。手始めに、ここではオリジナルのポストHEREからテーブルには、次のとおりです。

+----------+------------+--------+ 
| photo_id | project_id | active | 
|--------------------------------| 
|  1 |  1  | 1 | 
|  2 |  1  | 1 | 
|  3 |  1  | 1 | 
|  4 |  2  | 1 | 
|  5 |  2  | 1 | 
|  6 |  2  | 1 | 
|  7 |  3  | 1 | 
|  8 |  3  | 1 | 
|  9 |  3  | 1 | 
+----------+------------+--------+ 

これはポストに私にお勧めサブクエリが、私は追加の列、ファイル名、ギャラリー番号を追加しましたHERE

(SELECT photo_id FROM Photos 
    where project_id = p.project_id ORDER BY RAND LIMIT 1) as random_photo, 

を述べています各画像の関連付け幅、各画像の幅および各画像の高さを含む。

+----------+------------+----------+--------+---------+-------+--------+ 
| photo_id | filename project_id | active | gallery | width | height | 
|----------------------------------------------------------------------| 
|  1 | pic1.jpg | 1  | 1 | 1  | 600 | 400 | 
|  2 | pic2.jpg | 1  | 1 | 1  | 600 | 400 | 
|  3 | pic3.jpg | 1  | 1 | 1  | 400 | 600 | 
|  4 | pic4.jpg | 2  | 1 | 2  | 600 | 400 | 
|  5 | pic5.jpg | 2  | 1 | 2  | 600 | 400 | 
|  6 | pic6.jpg | 2  | 1 | 2  | 600 | 400 | 
|  7 | pic7.jpg | 3  | 1 | 3  | 400 | 600 | 
|  8 | pic8.jpg | 3  | 1 | 3  | 400 | 600 | 
|  9 | pic9.jpg | 3  | 1 | 3  | 400 | 600 | 
+----------+------------+----------+--------+---------+-------+--------+ 

のみ風景画像を選択するように、私はその幅が高さよりも大きかった画像のみを選択するようにクエリを更新:

(SELECT filename FROM photos 
WHERE project_id = p.project_id AND width > height ORDER BY RAND() LIMIT 1) as random_photo, 

を、必要に応じて、この作品。

私の新しいハードルは、ランダムイメージのファイル名と関連するギャラリー番号の両方を選択したいと思っています。これが私が立ち往生している場所です。私の元の投稿(HERE)には、別のテーブルからタグのリストを選択する別のサブクエリがあり、それはSELECT GROUP_CONCATを使用していますので、これをいくつかの方法で試しましたが、これは明らかに私の頭の上の領域です。

私はまた、このような二サブクエリ内random_photoを使用してみました:

(SELECT gallery FROM photos 
    WHERE filename = random_photo) as gallery_number, 

、それは動作しませんでした。理想的には、ランダムな写真のファイル名と関連するギャラリー番号をワンショットで取得したいと思います。ここに明白な何かが欠けている場合は私の謝罪、そしてあなたの助けを事前に感謝します。

答えて

1

単純だが少しぎこちないソリューションは、次のようになります。

(SELECT Concat(gallery,'___',filename) FROM photos 
WHERE project_id = p.project_id AND width > height ORDER BY RAND() LIMIT 1) as random_photo 

あなたはソリューションの上に使用している場合は、あなたのPHPコードの「___」の最初の出現で結果を分割する必要があります。

もっと複雑な解決策は、ランダムIDを選択し、結果を写真テーブルに加えることですが、これを行う方法はあなたの「メガクエリー」の他の部分に依存します。

+0

ありがとうございます。いくつかの質問:具体的には '' ___ ''やっていることは、これは'、 'と同じですか?また、あなたの意見では、これは厄介な解決策になるのでしょうか?複雑な解決策に関するあなたの提案については、私は同意します。 – mileaminute

+0

___はセパレータですので、後でPHPコードにマージされた2つのカラムを分割することができます。ギャラリー2の画像pic001.jpgの結果は、「2 ___ pic001.jpg」となります。これはまたそれについて不愉快なものです、それはいくつかのグルーコードが必要です。注意しないとファイル名に '___'が含まれていると、他の問題が発生する可能性もあります。最初の発生時に分割するだけで問題は発生しませんし、 ' - 'のような短い分離語を使用することもできますが、それを知っておく必要があります。 int gallerynumberはファイル名の前に置かれるため、すべてのファイル名で動作します。 – Compufreak

+0

すばらしい説明、ありがとう。私は自分のPHPコードでバインドされた変数を分解し、必要に応じてデータを出力することができました。どうもありがとうございます! – mileaminute

関連する問題