我需要获取最新订单(来 self 们的客户管理面板)。这是我的查询:
select *
from order
left join customer
on (customer.id = order.fk_cid)
where date = curdate()
order by time desc
limit 1;
这会输出我需要的订单和客户的所有内容,除了 1 因此这就是我使用 *
这是我的表结构:
order table:
id, fk_cid, date, time
customer table:
id, name, lastname, street, city, zip, country, phone, email, lastlogin
现在,在我的 php 中我有:
$result = mysql_query("
select *
from `order`
left join customer
on (customer.id = order.fk_cid)
where date = curdate()
order by time desc
limit 1");
$row = mysql_fetch_assoc($result, MYSQL_ASSOC);
此时我的订单不正确,为什么?
最佳答案
您的 customers.id
正在覆盖 order.id
因为您使用的是相同的列名称。
select *
from `order`
left join customer on (customer.id = order.fk_cid)
where date = curdate() order by time desc limit 1;
+------+--------+------------+----------+------+-------+------
| id | fk_cid | date | time | id | name | ....
+------+--------+------------+----------+------+-------+------
| 1 | 2 | 2011-11-30 | 07:01:23 | 2 | asasd | ....
+------+--------+------------+----------+------+-------+------
1 row in set (0.03 sec)
正如您在本例中看到的,您有两个 id
,因此当 PHP 使用 mysql_fetch_assoc
检索数据时,它会覆盖第二个 id
,因为它是数组中的相同键。要解决此问题,您必须在查询中指定列:
select `order`.id AS order_id, customer.id AS customer_id, customer.name /* etc... */
这将输出:
此外,我建议为您的表和字段使用不同的名称。 order
, date
, time
因为它们是保留字(以防你忘记使用 ` )。
Array
(
[order_id] => 1
[customer_id] => 2
// etc...
)
还有一个您应该阅读的主题:Why is SELECT * considered harmful?
关于php - 在 php 中选择 mysql 缺少的列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8379708/