繁体   English   中英

具有多个ID列和PHP的MySQL查询

[英]Mysql query with multiple ID columns and php

我有2个联接表,每个表都有一个名为id的主键列。

SELECT t1.*, t2.* from t1 join t2 on t1.fk_id=t2.id

当我运行上面的查询时,两个id字段都被选中(t1.id和t2.id)。 我的问题是,在遍历结果集时如何选择正确的ID? 如果选择$ result-> id,我将得到t2.id。 是否有任何方法也可以获取t1.id,而无需在查询中明确选择它(即t1.id为t1_id?)。另外,请让我们了解一些有关命名主键列的做法。

谢谢!

SELECT t1.id as id1, t2.id as id2, t1.*, t2.* from t1 join t2 on t1.fk_id=t2.id

您经常会看到表XXX的主键xxx_id。 这样可以使所有地方的“信息标识符”名称相同:例如,在另一个表YYY中,您将拥有YYY.xxx_id,且外键约束为XXX.xxx_id。 这使联接更容易(您不必在许多数据库中都完全指定“ on”约束),并且还解决了您遇到的问题。

我并不是说您应该为每个列名加上前缀以创建一个人造名称空间,但是在“ id”的情况下,它实际上是有用且具有描述性的。 毕竟,它不仅是任何种类的ID,还包括用户ID,网站ID,游戏ID,联系人ID和您所拥有的。

您可能正在使用mysqli_result::fetch_assoc将结果集的每一行作为关联数组返回。 MySQL将让您在查询中拥有两列具有相同名称的列,但是这些列不会按您希望的方式映射到关联数组,即使该关联数组的功能完全一样。

假设两个表, bookauthor ,由联结表book_author 在MySQL中,您可以运行以下查询,该查询返回两个id列:

SELECT b.*, a.*
FROM book AS b
JOIN book_author AS ba ON ba.book_id = b.id
JOIN author AS a ON a.id = ba.author_id
LIMIT 2;

+----+-----------------+----+--------------+
| id | title           | id | name         |
+----+-----------------+----+--------------+
|  1 | Design Patterns |  1 | Erich Gamma  |
|  1 | Design Patterns |  2 | Richard Helm |
+----+-----------------+----+--------------+

如果尝试将这些行之一映射到关联数组,则最终在数组中只有一个id元素:

$row = $result->fetch_assoc();
print_r($row);

Array
(
    [id] => 1
    [title] => Design Patterns
    [name] => Erich Gamma
)

该行中的最后一个id列将覆盖之前的所有id 这是结果集中的第二行:

Array
(
    [id] => 2
    [title] => Design Patterns
    [name] => Richard Helm
)

这与修改关联数组中元素的值相同。

$row = array();
$row['id'] = 1;
print_r($row);
Array
(
    [id] => 1
)

$row['id'] = 2;
print_r($row);
Array
(
    [id] => 2
)

如果通过在表本身中为其指定唯一名称,或者在查询中为其指定别名,则可以避免该问题:

SELECT b.id AS book_id, b.title,
    a.id AS author_id, a.name
FROM book AS b
JOIN book_author AS ba ON ba.book_id = b.id
JOIN author AS a ON a.id = ba.author_id
LIMIT 2;

+---------+-----------------+-----------+--------------+
| book_id | title           | author_id | name         |
+---------+-----------------+-----------+--------------+
|       1 | Design Patterns |         1 | Erich Gamma  |
|       1 | Design Patterns |         2 | Richard Helm |
+---------+-----------------+-----------+--------------+

$row = $result->fetch_assoc();
print_r($row);
Array
(
    [book_id] => 1
    [title] => Design Patterns
    [author_id] => 1
    [name] => Erich Gamma
)

或者,您可以(几乎肯定应该)使用准备好的语句 尽管可以解决列名重复的问题,但是在查询中使用唯一的列名仍然使事情更容易阅读和调试:

$sql = 'SELECT b.*, a.* ' .
   'FROM book AS b ' .
   'JOIN book_author AS ba ' .
   'ON ba.book_id = b.id ' .
   'JOIN author AS a ' .
   'ON a.id = ba.author_id';

$stmt = $mysqli->prepare($sql);
$stmt->execute();
$stmt->bind_result($book_id, $book_title, $author_id, $author_name);
while ($stmt->fetch()) {
    printf("%s, %s, %s, %s\n",
           $book_id,
           $book_title,
           $author_id,
           $author_name);
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM