[英]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
盡管它們是聚合函數,例如max
和group_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))
其中F
和G
是select
-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.