在mysql中是否还有其他可能性来解决这个问题

时间:2011-03-10 10:06:39

标签: php mysql codeigniter

我在我的数据库中有三个表,如预订,预订,结算。我正在使用连接查询。

我在这3张表中有五个以上的常用字段。在执行查询时,公共字段会被覆盖。

有没有办法从3表中获取每个值而不覆盖,也没有为这些公共字段提供别名?

[更新:根据最近的评论,OP正在询问如何使用CodeIgniter获取此类列表]

3 个答案:

答案 0 :(得分:2)

mysql> CREATE TABLE reservation (
    ->  id INT,
    ->  data VARCHAR(50)
    -> );
Query OK, 0 rows affected (0.42 sec)

mysql> CREATE TABLE booking (
    ->  id INT,
    ->  data VARCHAR(50)
    -> );
Query OK, 0 rows affected (0.06 sec)

mysql> CREATE TABLE billing (
    ->  id INT,
    ->  data VARCHAR(50)
    -> );
Query OK, 0 rows affected (0.05 sec)

mysql> INSERT INTO reservation (id, data) VALUES (1, 'Lorem ipsum'), (2, 'Dolor sit amet');
Query OK, 2 rows affected (0.05 sec)
Records: 2  Duplicates: 0  Warnings: 0

mysql> INSERT INTO booking (id, data) VALUES (1, 'Consectetur adipisicing'), (2, 'Consectetur adipisicing');
Query OK, 2 rows affected (0.03 sec)
Records: 2  Duplicates: 0  Warnings: 0

mysql> INSERT INTO billing (id, data) VALUES (1, 'Tempor incididunt'), (2, 'Ut labore');
Query OK, 2 rows affected (0.02 sec)
Records: 2  Duplicates: 0  Warnings: 0

mysql>
mysql> SELECT *
    -> FROM reservation
    -> LEFT JOIN booking ON reservation.id=booking.id
    -> LEFT JOIN billing ON booking.id=billing.id;
+------+----------------+------+-------------------------+------+-------------------+
| id   | data           | id   | data                    | id   | data              |
+------+----------------+------+-------------------------+------+-------------------+
|    1 | Lorem ipsum    |    1 | Consectetur adipisicing |    1 | Tempor incididunt |
|    2 | Dolor sit amet |    2 | Consectetur adipisicing |    2 | Ut labore         |
+------+----------------+------+-------------------------+------+-------------------+
2 rows in set (0.00 sec)

更新

OP正在询问如何在CodeIgniter PHP框架中执行此操作,我从未使用过该框架。我只能提供一般的PHP建议。大多数DB库提供了将查询结果作为数值数组和关联数组获取的方法。如果存在重复的列名称,则必须避免使用第二个列名称并坚持使用数字数组。例如,而不是:

while($row = $res->fetch(PDO::FETCH_ASSOC)){
}

......你必须这样做:

while($row = $res->fetch(PDO::FETCH_NUM)){
}

答案 1 :(得分:0)

为每个表创建视图,为每个重复的命名字段提供新的唯一名称。

好的,所以这仍然在理论上使用别名方法,但您只需要执行一次,然后使用视图中的新字段名称。现有的查询仍将适用于现有的字段名称。

答案 2 :(得分:0)

我不是百分百肯定,但我认为在这种情况下你需要使用别名。

但是你真的需要三次选择同一列吗?你不能只从一列中选择数据。然后,当您想要更新时,您会进行三次更新吗?

编辑:我读过“公共字段”,就像在多个表中复制相同的数据一样,也许你只是认为列名是相同的?