我有一个非常简单的查询,但我是初学者,我无法理解问题是什么,因为它在第二种情况下不能正常工作:
SELECT a.user_name, a.password, a.id, r.role_name
FROM accounts as a
JOIN roles as r ON a.role=r.id
SELECT accounts.user_name, accounts.password, accounts.id, roles.role_name
FROM accounts
JOIN roles ON accounts.role=roles.id
SELECT *
FROM accounts as a
JOIN roles as r ON a.role=r.id
accounts.role
和roles.id
与外键相关联。我尝试在第三个查询中使用*
选择所有内容,但它甚至没有得到任何东西,从第二个表只得到第一个表中的所有内容(如在上一张照片中)。那可能是什么问题呢?
这种行为没有任何意义,使用*
时必须显示所有字段
让我们对SQL Fiddle做一个测试
MySQL 5.6架构设置:
create table t1 ( i int, a char);
insert into t1 values (1,'a');
create table t2 ( i int, b char);
insert into t2 values (1,'a');
查询1:
select *
from t1 inner join t2 on t1.i = t2.i
| i | a | i | b |
|---|---|---|---|
| 1 | a | 1 | a |
查询2:
select *
from t1 x inner join t2 y on x.i = y.i
| i | a | i | b |
|---|---|---|---|
| 1 | a | 1 | a |
您可以看到所有字段出现的所有时间。可能是您用于连接和进行查询的程序的问题。检查两次你执行所有的句子,不仅是第一个2行,还检查它们是否是滚动条以查看更多数据。
我用给定的代码重新启动了数据库:
$mysqli->query('
CREATE TABLE `crm`.`roles`
(
`id` TINYINT(1) NOT NULL AUTO_INCREMENT,
`role_name` VARCHAR(20) NOT NULL,
`edit` TINYINT(1) NOT NULL DEFAULT 0,
PRIMARY KEY (`id`)
);') or die($mysqli->error);
$mysqli->query('
CREATE TABLE `crm`.`accounts`
(
`id` INT NOT NULL AUTO_INCREMENT,
`role` TINYINT(1) NOT NULL DEFAULT 1,
`user_name` VARCHAR(20) NOT NULL,
`password` VARCHAR(100) NOT NULL,
`email` VARCHAR(100) NOT NULL,
`first_name` VARCHAR(50) NOT NULL,
`last_name` VARCHAR(50) NOT NULL,
`hash` VARCHAR(32) NOT NULL,
`active` BOOL NOT NULL DEFAULT 0,
PRIMARY KEY (`id`),
FOREIGN KEY (`role`) REFERENCES roles(`id`)
);') or die($mysqli->error);
并且SELECT的每个组合现在都正常工作。我不知道问题是什么,因为我不记得对表格进行任何更改。