[更新2:解决方案]:最后,解决方案是提出两个不同的查询: 第一个查询循环Items(没有自定义字段):
$itemsQuery = 'SELECT * FROM itemsTable";
$items = $db->Exectue($itemsQuery);
然后,在项目的循环中,我进行第二次查询以匹配正确的海关字段:
//FIRST LOOP => Render the items
while ($row = $items->FetchRow())
{
//Query the custom fields within the Items loop
$customFieldsQuery = 'SELECT item.id,
customFieldName.id, customFieldName.value as fieldName,
customFieldValue.id, customFieldValue.customFieldNameId customFieldValue.value as fieldValue
FROM itemsTable AS item
LEFT JOIN customFieldNameTable as customFieldName
ON item.id = customFieldName.id
LEFT JOIN customFieldValueTable as customFieldValue
ON customFieldValue.customFieldNameId = customFieldValue.id
WHERE item.id = '.$row['id'].'';
$customFields = $db->Execute($customFieldsQuery)
//Loop the custom fields BY item
while ($row2 = $fields->FetchRow()){
// Show item title (unique)
echo $row['title'] . "<br/>";
//Show custom fields
echo $row2['fieldName'] . " : " . $row2['fieldValue'];
}
}
[更新]我的不好,我忘了确切地说每个项目都有几个自定义字段,因此关节的问题是它渲染了几个项目(每个自定义字段一个。此外,Group_concat不是&#39; ta解决方案,因为我需要独立访问每个自定义字段,因为网站的用户界面
我们说我有3张桌子:
Table ITEMS store the id, title of an Item (Rows : id, title)
另外两个表用于自定义字段:
表FIELDNAME
存储我们为自定义字段指定的名称:
行:id,id_item(用于检索正确项目的外键),值
表FIELDVALUE
存储我们为自定义字段赋予的值,并且有一个外键可以从FIELDNAME连接到它的名称值:
行:id,id_item(用于检索正确项目的外键),id_fieldname(用于检索正确字段名称的外键),值
示例:
Table ITEMS :
id = 1
title = "title of the item"
Table FIELDNAME :
(id = 1)
id_item = 1
value = "Country"
Table FIELDVALUE :
(id = 1)
id_item = 1
id_fieldname = 1
Value = "France"
我想做的是一个链接3个表的查询,以便我可以这样做:
while ($row = $myQuery->FetchRow())
{
{$row['item_title']} => output "Title of the item"
{$row['field.country']} => Output "Country: France"
}
$row['field.country']
将是fieldname:fieldval的一种串联。
我几乎用SQl的GROUP_CONCAT找到了一个好结果,但问题是它输出了一行中的所有自定义字段,虽然我需要独立访问每个字段(如
{$row['fieldname.country']} => "Country"
{$row['fieldname.country.value']} => "France"")
答案 0 :(得分:0)
您可以在所有表中创建联接 - 但如果您在PHP中将结果提取到数组中,则可能需要对这些字段进行别名。
您可能还需要回拨FIELDNAME.value
和FIELDVALUE.value
,因为value
是MySQL中的保留字。
类似的东西:
SELECT
ITEMS.id AS item_id,
ITEMS.title AS item_title,
FIELDNAME.id AS fieldname_id,
FIELDNAME.`value` AS fieldname_string,
FIELDVALUE.id AS fieldvalue_id,
FIELDVALUE.`value` AS fieldvalue_string
FROM ITEMS
INNER JOIN FIELDNAME
ON FIELDNAME.id_item = ITEMS.id
INNER JOIN FIELDVALUE
ON FIELDVALUE.id_item = ITEMS.id
AND FIELDVALUE.id_fieldname = FIELDNAME.id
如果您使用mysqli_result::fetch_array(MYSQLI_ASSOC);
之类的内容获取该内容,则最终应将每行作为数组添加:
array (
'item_id' => 1,
'item_title' => "Title of the item",
'fieldname_id' => 1,
'fieldname_string' => "Country",
'fieldvalue_id' => 1,
'fieldvalue_string' => "France"
)
另外,如果FIELDVALUE.id_item
+ FIELDVALUE.id_fieldname
是一个独特的组合,您可以创建复合主键,而不是使用(可能)自动递增的FIELDVALUE.id
答案 1 :(得分:0)
使用以下查询,您可以使用内部联接
获取它 SELECT i.title ,fn.value as filed_name,fd.value as field_value
from ITEMS i inner join FIELDNAME fn
on fn.id_item=i.id inner join FIELDVALUE fd on fd.id_fieldname = fn.id
答案 2 :(得分:-1)
所以你需要SQL Join:
SELECT Orders.OrderID, Customers.CustomerName, Orders.OrderDate
FROM Orders
INNER JOIN Customers
ON Orders.CustomerID = Customers.CustomerID;