2017-05-27 50 views
1

product表:错误做一个完全外部联接

╔══════════════════════════════════╦═══════════╦═══════════════════╦════════════════════╦════╗ 
║    ref    ║ mfr ║  pnum  ║  ssku  ║ id ║ 
╠══════════════════════════════════╬═══════════╬═══════════════════╬════════════════════╬════╣ 
║ 6541_aten_2a-130g    ║ Aten  ║ 2A-130G   ║ 2A-130G   ║ 6 ║ 
║ 7466_eaton_5sc1000i    ║ Eaton  ║ 5SC1000I   ║     ║ 8 ║ 
║ 8214_ivanti-uk_template-material ║ IVANTI UK ║ TEMPLATE MATERIAL ║ 000000000003616655 ║ 4 ║ 
║ 8361_aywun_92sfan1    ║ Aywun  ║ 92SFAN1   ║ 92SFAN    ║ 9 ║ 
║ 9824_autodesk_00100-000000-9880 ║ AUTODESK ║ 00100-000000-9880 ║ 00100-000000-9880 ║ 5 ║ 
╚══════════════════════════════════╩═══════════╩═══════════════════╩════════════════════╩════╝ 

inventory表:

╔══════════════════════════════════╦═══════╦═════════╦═════════════════════╗ 
║    ref    ║ scost ║ instock ║  date   ║ 
╠══════════════════════════════════╬═══════╬═════════╬═════════════════════╣ 
║ 6541_aten_2a-130g    ║ 26 ║  0 ║ 2017-05-27 10:45:23 ║ 
║ 7466_eaton_5sc1000i    ║ 489 ║  0 ║ 2017-05-27 10:45:23 ║ 
║ 8214_ivanti-uk_template-material ║  0 ║  0 ║ 2017-05-27 10:45:23 ║ 
║ 8361_aywun_92sfan1    ║  4 ║  0 ║ 2017-05-27 10:45:23 ║ 
║ 9824_autodesk_00100-000000-9880 ║ 738 ║  0 ║ 2017-05-27 10:45:23 ║ 
╚══════════════════════════════════╩═══════╩═════════╩═════════════════════╝ 

...,我希望从两个表做一个FULL OUTER JOIN(得到列只有当关键使用Medoo存在于两个,如果我理解正确):

$data = $database->select("product", [ 
    "[<>]inventory" => ["ref" => "ref"], 
]); 

错误:

Invalid argument supplied for foreach() in /var/www/html/vendor/catfan/medoo/src/Medoo.php on line 

我也尝试过这些查询的控制台,但得到一个语法错误:

SELECT * 
FROM product 
FULL OUTER JOIN product ON product.ref = inventory.ref; 

SELECT * FROM `product`, * FROM `inventory` 
WHERE product.`ref` = inventory.`ref`; 

预期结果:

╔═══════════════════╦══════╦═════════╦═════════╦════╦═══════╦═════════╦═════════════════════╗ 
║  ref  ║ mfr ║ pnum ║ ssku ║ id ║ scost ║ instock ║  date   ║ 
╠═══════════════════╬══════╬═════════╬═════════╬════╬═══════╬═════════╬═════════════════════╣ 
║ 6541_aten_2a-130g ║ Aten ║ 2A-130G ║ 2A-130G ║ 6 ║ 26 ║  0 ║ 2017-05-27 10:45:23 ║ 
╚═══════════════════╩══════╩═════════╩═════════╩════╩═══════╩═════════╩═════════════════════╝ 
+0

每个'ref'小号eems在两个表中是相同的。为什么你的预期结果只有一个记录。而你的sql'加入'同一个表'产品'。 – Blank

+0

@Forward啊,是这个问题吗?我是MySQL的新手,所以没有关于关系数据库的线索。现在我明白了,列名应该是不同的我猜,这就是为什么它不工作。 – 3zzy

+0

@Forward这是我的数据库结构:https://pastebin.com/6A0E1xUM – 3zzy

回答

2

MySQL不支持FULL OUTER JOIN,和你的逻辑似乎是INNER JOIN

SELECT * 
FROM product 
INNER JOIN inventory ON product.`ref` = inventory.`ref`; 

但我不知道为什么两个表中ref的都是一样的,您预期的结果只有一个记录,根据Medoo文档,代码应该像如下:

$data = $database->select(
    "product", 
    [ 
     "[><]inventory" => "ref" 
    ], 
    "*"); 

对于所有的表的,试试这个:

$data = $database->select(
    "product", 
    [ 
     "[><]inventory" => "ref", 
     "[><]detail" => "ref", 
     "[><]moredetails" => "ref", 
     "[><]info" => "ref", 
     "[><]images" => "ref", 
     "[><]features" => "ref", 
     "[><]categories" => "ref", 
     "[><]tags" => "ref" 
    ], 
    ["product.*", "inventory.*"]); 
+0

太棒了,按预期工作!谢谢! – 3zzy

+0

只注意到它显示第一行两次的唯一问题。 – 3zzy