簡體   English   中英

MySQL選擇另一個表中具有多行的行

[英]MySQL select rows with multiple rows in another table

我有這兩個表:

畫廊- {id,title,description}
圖片- {id,gallery_id,file}

每個圖庫在圖像表中都有多個圖像。

如何最好地做到這一點:

答:選擇所有畫廊,然后運行一個for循環,並為每個重新查詢數據庫查找與之相關的每個圖像。


$sql='select * from galeries';
$result=mysql_query($sql);
while($row=mysql_fetch_assoc($result))
{
    $sql2='select * from images where gallery_id='.$row['id'];
    //etc
}

B.使用左聯接選擇所有畫廊和圖像,因此獲得畫廊信息的次數是畫廊有圖像的次數。

$sql='select * from galleries left join images on galleries.id=images.gallery_id';`

或者,還有更好的方法? 謝謝。

(A)是簡單的方法,但是要花費多個查詢到數據庫。 如果您的數據庫服務器很忙,由於這個原因,它將更加繁忙。

(B)是工程師的出路,使用較少的數據庫調用,通常是最有效的數據庫調用。 但是,這將要求您使用我們在大學中學到的小組休息邏輯。

當我編碼時,我采用(B)方式。 當我周圍的人編碼時,他們大多(99%+)以(A)方式編碼! 當我告訴這些人我使用(B)的理由時,他們說他們的客戶有錢,可以根據需要購買更好的硬件!

干杯!

我認為B是最好的選擇,因為在A中,您需要為每個查詢獲得與數據庫的連接,然后將幾乎相同的查詢(僅在where子句中具有不同的ID)多次發送到數據庫,並提取並處理再次獲得結果,因此您不需要處理和數據傳輸。
許多程序員不使用join語句,因為他們認為這會使他們的查詢變得過於繁重! 但是除非您的聯接表有大量的行,否則我猜像B這樣的簡單聯接不會造成任何問題。 只需注意使用連接,以避免選擇未使用的行或列。
結果,我可以保證B是您最好的解決方案!

由於重復,我不喜歡A。 我不喜歡B,因為您運行的每個查詢都有開銷。

如果我要存儲兩個表中的數據。 我會在一個查詢中獲得圖庫,並將其存儲在一個數組中。 然后,我將在一個循環中獲得最少畫廊數所需的圖像,可能會對其進行緩存以避免再次獲取,但這取決於許多考慮因素

如果不是很大的話,我可能還是聳聳肩,使用A或B中的任何一個使我的代碼更具可讀性。 它們都以自己的方式效率低下,但是工作一圈會增加設計的復雜性。 值得嗎?

# you want to get latest 10 galleries, I assume
$query = 'SELECT * FROM `galleries` ORDER BY `id` DESC LIMIT 10';
$result = mysql_query($query);

while($row = mysql_fetch_object($result)) {
    $ids = isset($ids) ? ', '.$row->id : $row->id;
}

# you really don't want to get all the images
# limit amount to some number, ex: 200
$query = 'SELECT * FROM `images` WHERE `gallery_id` IN('.$ids.') ORDER BY `id` DESC LIMIT 200';
...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM