我遇到了一个要在其中显示产品规格的修补程序,就像它们在任何电子商务网站上显示的一样。这里的属性组应该出现一次,包括其中的所有属性和值。但是,父属性组出现多次,并且其中的属性重复主题。它被反向显示在这里与我的期望。为了解释清楚,我将尽可能清楚地包括我的数据库结构,显示的视图以及我迄今为止尝试过的代码。首先,我将从数据库结构开始。假设我有三个表。
attribute_groups
atg_id atg_name atg_order
1 Memory 2
2 Motherboard 3
3 Processor 4
4 Technical 1
属性
atr_id atr_group atr_name atr_order
1 3 Clock Speed 2
2 3 Description 1
3 3 No. of Cores 3
4 4 Test 1 2
5 1 Test 2 1
6 4 Test 3 1
product_attributes
pat_id pat_product pat_attribute pat_value
1 1 1 2.8Ghz
2 1 2 This is some description
3 1 3 8
4 1 4 Test Value 1
5 1 5 Test value 2
使用此信息,我想显示这样的规格(例如在电子商务网站上)。
Technical
Test 1 Test Value 1
Memory
Test 2 Test value 2
Processor
Clock Speed 2.8Ghz
Description This is some description
No. of Cores 8
但是从我当前的代码来看,它的外观是这样的
Technical
Test 1 Test Value 1
Memory
Test 2 Test value 2
Processor
Clock Speed 2.8Ghz
Clock Speed This is some description
Clock Speed 8
Processor
Description 2.8Ghz
Description This is some description
Description 8
Processor
No. of Cores 2.8Ghz
No. of Cores This is some description
No. of Cores 8
处理器属性组出现三次,属性重复出现,而不是父属性出现,所有三个属性一起出现。
到目前为止,我的PHP逻辑
// Fetch Product Specifications
$atGroup = $pdo->prepare("SELECT * FROM attribute_groups
LEFT JOIN attributes ON attribute_groups.atg_id = attributes.atr_group
LEFT JOIN product_attributes ON product_attributes.pat_attribute = attributes.atr_id
WHERE pat_attribute = atr_id AND pat_product = :id ORDER BY attribute_groups.atg_order ASC");
$atGroup-> bindValue(':id', $_GET['id']);
$atGroup-> execute();
while($at = $atGroup->fetch()){
echo $at['atg_name']; echo "<br>";
$specs = $pdo->prepare("SELECT * FROM product_attributes
LEFT JOIN attributes ON product_attributes.pat_attribute = attributes.atr_id
LEFT JOIN attribute_groups ON attribute_groups.atg_id = attributes.atr_group
WHERE pat_product = :id AND atg_id = :atg GROUP BY atr_name");
$specs-> bindValue(':id', $_GET['id']);
// $specs-> bindValue(':at', $at['atr_id']);
$specs-> bindValue(':atg', $at['atg_id']);
$specs-> execute();
while($sp = $specs->fetch()){
echo $at['atr_name']; echo $sp['pat_value']; echo "<br>";
}
}