【问题标题】:Reference JOINed MySQL data like JSON table参考 JOINed MySQL 数据,如 JSON 表
【发布时间】:2015-12-31 23:41:49
【问题描述】:

标题可能很奇怪,因为我不知道该怎么形容我在做什么。

我正在构建一个按名称排序的名册系统(想想部门、公司、排等)。我希望这个显示是完全动态的,并且我正在努力做到这一点。

在同一个数据库中,我有 2 个不相等的表,尽管它们共享几个列名,有时数据值相等,有时不相等。表tali_personnel_designations_weights 存储名称类别(师、连等),而表tali_personnel_designations 存储实际名称(第3 步兵师、基洛连等)。有很多事情正在发生,但 1 的答案会让我回到路上。两个表都有一个名为“name”的列,其中包含该条目的名称,例如 _weights 的 Division 和指定的 3rd Infantry Division。在我的 SQL 中,我希望能够同时选择这两个名称,但因为它在下面,所以唯一的返回来自 tali_personnel_designations_weights,就好像第一个表在结果中被重写了一样。

$SQL = "SELECT * FROM tali_personnel_designations JOIN tali_personnel_designations_weights ON tali_personnel_designations.designation_weight_id=tali_personnel_designations_weights.designation_weight_id ORDER BY tali_personnel_designations_weights.weight DESC, tali_personnel_designations.weight DESC";
$result = mysqli_query($db_handle, $SQL);

while ($db_field = mysqli_fetch_assoc($result)) {
    $name = $db_field['name'];
    echo $name; //output is value for 'name' in tali_personnel_designations_weights
    echo "<br/>";
}

我正在尝试做的事情,如果你可以想象的话:

$designation_name = $db_field['tali_personnel_designations.name']; //output 3rd Infantry Division
$designationweight_name = $db_field['tali_personnel_designations_weights.name']; //output Division

我知道解决这个问题的简单方法是重命名列,这样“名称”就不会发生冲突,但我想在这里学习一些新东西!

感谢您的帮助。

【问题讨论】:

  • 无需更改列,您可以通过 sql 执行此操作:select tablename.fieldname as newFieldname
  • 感谢您的回复。但是我仍然需要所有的列,所以想使用* 通配符。下面没有工作。语法问题? $SQL = "SELECT tali_personnel_designations.name AS designation_name, tali_personnel_designations_weights.name AS designation_weight_name, * FROM tali_personnel_designations JOIN tali_personnel_designations_weights ON tali_personnel_designations.designation_weight_id=tali_personnel_designations_weights.designation_weight_id ORDER BY tali_personnel_designations_weights.weight DESC, tali_personnel_designations.weight DESC";
  • 使用 Tablename.* 来选择一个表的所有列
  • Tablename.* AS 设置什么?
  • 使用下面的 'tali_personnel_designations.name' 引用,我被告知值未定义。 $SQL = "SELECT tali_personnel_designations.*, tali_personnel_designations_weights.* FROM tali_personnel_designations JOIN tali_personnel_designations_weights ON tali_personnel_designations.designation_weight_id=tali_personnel_designations_weights.designation_weight_id ORDER BY tali_personnel_designations_weights.weight DESC, tali_personnel_designations.weight DESC";

标签: php html mysql sql mysqli


【解决方案1】:

您的查询应该是这样的:

SELECT
    T.*, 
    T.name AS designation_name,
    TW.name AS designation_weight_name
FROM tali_personnel_designations T
JOIN tali_personnel_designations_weights TW
    ON T.designation_weight_id=TW.designation_weight_id
ORDER BY TW.weight DESC, T.weight DESC

然后在使用结果时你可以得到$db_field['designation_name']$db_field['designation_weight_name'],不要介意(也存在)$db_field['name']

请注意,使用别名作为表名使其更具可读性。

【讨论】:

  • 引用 $db_field['designation_weight_name'] 有效,但其余无效。 $db_field['tali_personnel_designations.weight'] 应该由通配符表示,但错误表明它未定义。
  • 你不应该写$db_field['tali_personnel_designations.weight'],而是$db_field['weight']。现在,我意识到您没有 only name 作为共享列标识符的表单。所以对于weight(也许还有其他的?),您必须执行与name 相同的操作,即明确使用像T.weight AS desination_name_weight 这样的列别名。请注意,您必须只为 PHP 结果中要使用的列提供别名;在 SQL 部分,不要介意。
  • 我还需要第二张表中的所有列。添加TW.* 可以吗?
  • 对于`TW.*``,是的。
  • 这不是我所希望的,但它比我的选择要好。感谢您的回答!
猜你喜欢
  • 2023-03-14
  • 1970-01-01
  • 1970-01-01
  • 2015-08-03
  • 2017-10-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多