簡體   English   中英

從兩個Mysql表獲取信息

[英]Getting info from two Mysql Tables

我正在使用Codeigniter,並且嘗試從兩個表中調用信息:

產品:id,名稱,價格,描述,typeId

產品類型:tCategory,tName

我正在嘗試從Product中提取所有信息,並使用Product.typeID來匹配Product_Type表,而僅返回tName。 大多數情況下,Product_Type表中至少會有3行具有相同的typeID。 例:

產品1將是一件售價為20美元的紅色襯衫,而從類型I中將需要大,中和小。

我嘗試使用JOIN進行此操作,但是它給了我所需的3種類型,但也將襯衫信息重復了3次。

這是我的代碼:

$this->db->select('product.id, product.name, product.price, product.description, product_type.tName');  
$this->db->from('product');
$this->db->where('perm_name', $id);
$this->db->join('product_type', 'product_type.tCategory = product.typeId', 'LEFT OUTER');
$query = $this->db->get(); 

任何幫助將不勝感激。

編輯:

Array
(
    stdClass Object
        (
            [id] => 2
            [name] => Tshirt 1
            [price] => 20
            [description] => Awesome tshirt
            [tName] => 1
    )

)

Array
(
    [0] => stdClass Object
        (
            [tCategory] => 1
            [tName] => Small
    )

    [1] => stdClass Object
        (
            [tCategory] => 1
            [tName] => Medium
    )
    [2] => stdClass Object
        (
            [tCategory] => 1
            [tName] => Large
    )

)

要使一個產品行包含一個填充有第二個表的行的列types ,您可以將兩個表連接起來並使用group by進行操作:

SELECT 
    product.id, 
    max(product.name) as name, 
    max(product.price) as price, 
    max(product.description) as description, 
    group_concat(product_types.tName) as types

FROM
    product

LEFT JOIN
    product_type ON product.tName = product_types.tCategory

GROUP BY product.id

max(product.name)后面沒有魔術。 您不得使用選擇子句中不在分組子句中或未歸類的列。 由於product.id是主鍵,因此每個product.id只會獲得一個product.name,因此我們不在乎選擇3個product.name(來自3種類型的聯接)中的哪個。 他們都是一樣的。 我們甚至可以在選擇子句中寫any(product.name),但是我不認為mysql支持這一點。 =)

或者做一個相關的子查詢〜

SELECT 
    product.id, 
    product.name, 
    product.price, 
    product.description, 
    (SELECT 
         group_concat(product_types.tName)
     FROM product_types
     WHERE product.tName = product_types.tCategory
     GROUP BY product_types.tCategory
    ) as types

FROM
    product

我建議使用第一個查詢,因為這將使mysql優化更加容易。 記錄:我沒有測試那些查詢,因此它們可能需要一些調整。 讓我知道。

Edit1:有關使用max()的進一步說明

在以下查詢中,我們不允許使用列name ,因為我們僅按列id分組。

SELECT
    id,
    name /* not allowed */

FROM
    product

GROUP BY id

我們只能group by -clause選擇組中的列。 我們也可以使用列,但這些列不在group_concat group by盡管它們是聚合函數,例如maxgroup_concat

為了解決這個問題,我們可以group by -clause將列name添加到group by

SELECT
    id,
    name /* ok because it's in group by */

FROM
    product

GROUP BY id, name

如果我們現在具有不同的name值,則結果中將得到多個元組,例如:

對於product表(id,name)= {(1,Alice),(1,Bob)},我們得到結果

1, Alice
1, Bob

因為我們將這兩列都分組了。

第二種方法是使用聚合函數,例如max:

SELECT
    id,
    max(name) /* ok because it's aggregated */

FROM
    product

GROUP BY id

對於product表(id,name)= {(1,Alice),(1,Bob)},我們得到結果

1, Bob /* max(Alice,Bob) = Bob, because A < B */

在您的示例中,我假設product.id列是主鍵,因此是唯一的。 這意味着在id列中,相等的值不能在name列中具有不同的值。 {(1, Alice), (1, Bob)}是不可能的,但可能是{(1, Alice), (2, Bob)} 如果現在對GROUP BY product.id進行分組,則將獲得組中每個元組的product.name值。 但是由於id決定了name ,所以這些值都相同:

SELECT 
    product.id, 
    product.name, 
    product_type.tName,

FROM
    product

LEFT JOIN
    product_type ON product.tName = product_types.tCategory

將導致

(1, "White T-Shirt", Small),
(1, "White T-Shirt", Medium),
(1, "White T-Shirt", Large),
(2, "Black T-Shirt", Small),
(2, "Black T-Shirt", Medium),
(2, "Black T-Shirt", Large)

按product.id分組后,結果將如下所示

(1, F("White T-Shirt", "White T-Shirt", "White T-Shirt"), 
     G(Small, Medium, Large)),
(2, F("Black T-Shirt", "Black T-Shirt", "Black T-Shirt"), 
     G(Small, Medium, Large))

其中FGselect -clause中使用的聚合函數。 對於F ,我們使用哪個值都沒有關系,它們都是相同的。 所以我們只用了max 對於g,我們使用group_concat將所有值連接在一起。

因此

F("White T-Shirt", "White T-Shirt", "White T-Shirt") = "White T-Shirt"
F("Black T-Shirt", "Black T-Shirt", "Black T-Shirt") = "Black T-Shirt"
G(Small, Medium, Large) = "Small, Medium, Large"

這將導致

(1, "White T-Shirt", "Small, Medium, Large"),
(2, "Black T-Shirt", "Small, Medium, Large")

暫無
暫無

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

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