多个表

时间:2016-07-01 15:31:01

标签: php mysql sql

[更新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"")

3 个答案:

答案 0 :(得分:0)

您可以在所有表​​中创建联接 - 但如果您在PHP中将结果提取到数组中,则可能需要对这些字段进行别名。

您可能还需要回拨FIELDNAME.valueFIELDVALUE.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;