2017-10-10 218 views
0

早在1月份,我收到了一些關於將多個數據庫查詢合併爲一個「兆」查詢的非常有用的信息,它可以找到HERE在一個子查詢中從同一表的兩列中選擇記錄

我已經擴展了其中一個子查詢,這個從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

___只是一個分隔符,所以你可以拆分2列,這兩列在你的php代碼中合併成一個。您在圖庫2中的圖片pic001.jpg的結果將爲'2 ___ pic001.jpg',全部在一列中。這也是它的尷尬,它需要一些膠水代碼。如果您不小心並且文件名包含'___',它也可能會導致其他問題。如果你只是在第一次出現時分裂,這不應該引起問題,你甚至可以使用更短的分隔符,如' - ',但你需要知道它。它適用於所有文件名,因爲int gallerynumber放在文件名之前。 – Compufreak

+0

很好的解釋,謝謝。我在我的php代碼中爆炸了綁定變量,並能夠根據需要輸出數據。非常感謝! – mileaminute

相關問題