【问题标题】:Fixing Ambiguous Column in WHERE Clause修复 WHERE 子句中的歧义列
【发布时间】:2016-12-16 16:15:25
【问题描述】:

我需要显示一个与我在下拉列表中选择一个值后选择的值相对应的表格。如果我在我的 SQLPro Studio 中运行这个查询,并且显然没有 $mr_id 变量,它会说 MR_ID 是模棱两可的。有没有办法解决这个问题?这对我来说似乎是一个小问题,但我似乎无法弄清楚。我只需要确保某处有一个WHERE 子句,以便它只显示与所选值相关的值。

该表只有 2 列,MR_ID(即显示在下拉列表中的内容,还与不在表中的另一列连接)和Supp_ID

<?php
$host="xxxxxxxxxxxx"; 
$dbName="xxxxx"; 
$dbUser="xxxxxxxx"; 
$dbPass="xxxxxxxxxxxxxx";

$mr_id = $_POST['mr_id'];

$dbh = new PDO( "sqlsrv:server=".$host."; Database=".$dbName, $dbUser, $dbPass);
$dbh->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );

$sql_one = "
SELECT CONCAT(CAST(Stage_Rebate_Index.MR_ID AS INT),' - ', Stage_Rebate_Master.MR_Name) AS MR_ID,
       Stage_Rebate_Index.MR_ID AS sort_column, 
       CAST(Supp_ID as INT) AS Supp_ID
FROM   Stage_Rebate_Index
  LEFT JOIN Stage_Rebate_Master 
    ON Stage_Rebate_Master.MR_ID = Stage_Rebate_Index.MR_ID
WHERE  Stage_Rebate_Index.MR_ID = '$mr_id'
ORDER BY sort_column";


//$users = $dbh->query($sql);
$users_one = $dbh->query($sql_one);
?>

<html>
    <body>

        <!-- Table -->
<p> 
    <div id="table_div">
        <table border="1" id="index_table" class="ui-widget ui-widget-content">
            <thead>
                <tr class="ui-widget-header">
                <td>MR ID</td>
                <td>Supplier ID</td>
                </tr>
            </thead>
            <?php foreach($users_one->fetchAll() as $supp) { ?>
            <tr>
                <td class="mr_id"><?php echo $supp['MR_ID'];?></td>
                <td class="supp_id"><?php echo $supp['Supp_ID'];?></td>
            </tr>
            <?php } ?>
        </table>
    </div>

    </body>
    </html>

编辑: 使用硬编码值更新查询...

$sql_one = "
SELECT 
       CONCAT(CAST(t1.MR_ID AS INT),' - ', COALESCE(t2.MR_Name, '')) AS MR_ID,
       t1.MR_ID AS sort_column, 
       CAST(Supp_ID as INT) AS Supp_ID
FROM Stage_Rebate_Index t1
      LEFT JOIN Stage_Rebate_Master t2
         ON t2.MR_ID = t1.MR_ID
WHERE  
  CONCAT(CAST(t1.MR_ID AS INT),' - ', t2.MR_Name) = LTRIM(RTRIM('1 - Company A'))
ORDER BY sort_column";

【问题讨论】:

  • 更新问题并删除与您的问题相关的所有内容。如果您询问 SQL - 请从您的问题中删除所有 html/css/javascript。
  • 你应该开始为你的表名使用别名,这样会更容易

标签: javascript php sql-server ajax ambiguous


【解决方案1】:

在你的 where 子句中

WHERE
    MR_ID = '$mr_id'

这样指定你想要的表:

WHERE
    Stage_Rebate_Master.MR_ID = '$mr_id'

您可能还应该在 select 子句中指定表。

【讨论】:

  • 这很好,因为它摆脱了我的模棱两可的列,但是这个连接的值不在 Stage_Rebate_Index 或 Master 表中......它只是 2 之间的连接
  • 将select语句中的别名改为不匹配列名,然后在where中使用。或者在 where 子句中使用整个连接公式。
【解决方案2】:

从您对 Zackary Murphy 的解决方案的评论来看,您想要的 MR_ID 实际上是选择中的计算值,而不是表中的列值。试试这个。

SELECT 
       CONCAT(CAST(t1.MR_ID AS INT),' - ', COALESCE(t2.MR_Name, '')) AS MR_ID,
       t1.MR_ID AS sort_column, 
       CAST(Supp_ID as INT) AS Supp_ID
FROM Stage_Rebate_Index t1
      LEFT JOIN Stage_Rebate_Master t2
         ON t2.MR_ID = t1.MR_ID
WHERE  
  CONCAT(CAST(t1.MR_ID AS INT),' - ', t2.MR_Name) = LTRIM(RTRIM('$mr_id'))
ORDER BY sort_column

*编辑以添加表别名。

*编辑添加了空白修剪。

*在t2.MR_Name 为空的情况下编辑添加了 COALESCE。

【讨论】:

  • 这行得通,但由于某种原因,没有获取$mr_id 的值....我什至做了一个echo $mr_id 以确保正确地引入了值。
  • $sql_one 本身做一个回声,我很好奇它是如何构建出来的。
  • 好的,找到问题了....值的格式是1 - Company A,但是,当这个查询运行时,它显示为` 1 - Company A `...所以有是 1 之前和 A 之后的额外空格...那应该是什么样子?
  • 听起来我们只需要修剪一下。我会更新查询。
  • 每当我将其回显并将其放入我的 SQLPro Studio 中时,它都可以工作...但是,当我在下拉列表中选择一个值时仍然没有任何反应...不知道为什么那行不通跨度>
【解决方案3】:

您必须给出表列的完全限定名称。

就像你有 2 个表,table1 和 table2,并且在两个表中都有 col1 作为列名

如果您从下面这两个表中检索数据是查询示例

select 
    table1.co11 as tbl1col1, table2.col1 as tbl2col1 
from 
    table1 
join 
    table2 on table1.id = table2.id 
where 
    table1.col1 = "your statement" and table2.col1 = "your statement"

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-12-09
    • 1970-01-01
    • 2016-04-25
    • 1970-01-01
    • 2023-03-27
    • 2021-05-27
    • 2019-08-16
    相关资源
    最近更新 更多