为什么我的JOIN不起作用?

时间:2016-09-08 13:34:39

标签: php mysql

我有两张桌子。我的第一个表ps_product包含id_product,price,unity和reference。我正在尝试加入另一个名为ps_product_lang的表,其中包含一个名为name的列。

我收到以下错误:

Error: SQLSTATE[23000]: Integrity constraint violation: 1052 Column 'id_product' in field list is ambiguous

我还提供了以下代码:

try {
    $conn = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password);
    $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    $stmt = $conn->prepare("SELECT id_product, price, unity, reference FROM ps_product JOIN ps_product_lang ON ps_product.id_product WHERE ps_product_lang.id_product = id_product"); 
    $stmt->execute();
    $product = $stmt->fetchAll();

    echo '<div class="table-responsive">';
        echo '<table class="table table-striped">';
            echo '<th>Checkbox</th><th>Product ID</th><th>Product Name</th><th>Price</th><th>Unit</th><th>Reference</th>';
                foreach ($product as $row) {
                    print '<tr>';
                        print '<td><input type="checkbox" name="'. $row["id_product"] .'" value="'. $row["id_product"] .'"></td>';
                        print '<td>'. $row["id_product"] .'</td>';
                        print '<td>'. $row["name"] .'</td>';
                        print '<td>'. $row["price"] .'</td>';
                        print '<td>'. $row["unity"] .'</td>';
                        print '<td>'. $row["reference"] .'</td>';
                    print '</tr>';
                }
        echo '</table>';
    echo '</div>';
}

catch(PDOException $e) {
    echo "Error: " . $e->getMessage();
}

$conn = null;

为什么$ row [&#34; name&#34;]等于什么,为什么我会列出错误?

2 个答案:

答案 0 :(得分:2)

你错过了连接查询中的ON子句,并且在应用ON后不需要在哪里。在字段名称id_product之前,ps_product的别名也丢失了。请检查下面的查询。如果这两个表之间的其他字段也很常见,那么也需要别名。

$stmt = $conn->prepare("SELECT ps_product.id_product as id_product,name, price, unity, reference FROM ps_product JOIN ps_product_lang ON ps_product_lang.id_product = ps_product.id_product"); 

答案 1 :(得分:0)

由于您正在两个表之间进行连接,并且此连接的对象是两个同名的列,因此SQL不知道它应该返回给您哪一列。您可以在表上使用别名来帮助SQL引擎知道他应该在acount中使用哪个:

SELECT  PRD.id_product, 
        price, 
        unity, 
        reference 
FROM    ps_product PRD
JOIN    ps_product_lang PRL ON PRD.id_product = PRL.id_product

现在,SQL知道您将选择表id_product的列ps_product而不是同名的另一列(ambigous)。