mySql在非唯一列上连接两个表

mySql在非唯一列上连接两个表,mysql,join,Mysql,Join,我有以下表格: 表地区: id DD text ---|----|----- 1 | 01 | texas 2 | 02 | ny 5 | 03 | washington 表3理事会: id DD CC text ---|----|----|----- 1 | 01 | 01 | text1 2 | 02 | 01 | text2 5 | 02 | 02 | text3 3 | 02 | 03 | text4 4 | 03

我有以下表格:

表地区:

id   DD   text   
---|----|-----
1  | 01 | texas     
2  | 02 | ny     
5  | 03 | washington   
表3理事会:

id   DD   CC   text
---|----|----|-----
1  | 01 | 01 | text1 
2  | 02 | 01 | text2
5  | 02 | 02 | text3
3  | 02 | 03 | text4
4  | 03 | 01 | text5
5  | 03 | 02 | text6
6  | 01 | 02 | text7
服务员:

id   name    DD   CC
---|-------|----|----
1  | john  | 02 | 03 
2  | mike  | 03 | 02
3  | julia | 01 | 02
我想进行查询,因此得到以下结果:

结果:

 name     District    Council
-------|------------|-------
 john  | ny         | text4 
 mike  | washington | text6
 julia | texas      | text7
到目前为止,我有以下疑问:

select p.name,d.text as district,c.text as council
    from  person p 
        inner join districts d on p.DD=d.DD
        inner join councils c on p.DD=c.DD and p.CC=c.CC
where 1;
我认为逻辑应该是正确的,但不知何故我得到了一个错误。。。有人能帮我理解这一点,或者给我指出正确的方向吗

如果我这样做,它会返回结果,但不是预期的结果,当然:

select p.name,d.text as district,c.text as council
    from  person p 
        inner join districts d on p.DD=d.DD
        inner join councils c on p.CC=c.id
where 1;
谢谢

编辑:这是一个排序问题。。。我的建议是,如果你发现这是不使用查询浏览器的原因是错误不是很详细。。。可能有一个选择,但我不知道


谢谢大家

我不知道你们的模式,但我做了以下几件事(而且效果很好!)


您的第一个查询应该已经工作了。。。仅删除WHERE 1。。。如果要从“person”表返回所有记录,则根本不需要where子句。您的表别名使用正确,并且第一个查询正确地连接到地区和议会上的议会,否则您的第二个示例查询将为一个人返回多行,因为只有重复的“议会”代码


“WHERE 1”失败了。。。因为1不是逻辑表达式。。。如果使用,您将不得不执行“WHERE 1=1”

您得到的错误是什么?胡乱猜测:表是
person
还是
persons
?另一个可能的问题:连接的字段是相同类型的吗?感谢您的回复!!错误是“查询无法执行”(不是很有帮助)字段都是相同类型的Varchar(32)在workbench中对其进行了测试,得到了一个更详细的错误。。。事实上,这是一些字段的整理,没有马赫!!谢谢大家在workbench中测试了它,得到了一个更详细的错误。。。事实上,这是一些字段的整理,没有马赫!!感谢大家
WHERE 1
在MySQL中验证为
WHERE True
WHERE 2
WHERE 3
,等等也是如此。@ypercube,感谢您纠正我的错误(供我将来使用)。。。然而,我从来没有使用过浪费的where子句,比如在这里应用的一个,其中所有记录都将被返回。。。如果是一个数值,我总是显式地将操作比较与之比较。我经常看到在用PHP或其他语言构建动态查询时使用它。首先创建
选择。。。其中1=1
,然后添加任何约束条件
和constr1
和constr2
,等等。。。只是跳过代码中的IF-ELSE。
CREATE TABLE `districts` (
    `id` INT(10) unsigned NOT NULL,
    `DD` CHAR(20) NOT NULL,
    `text` CHAR(100) NOT NULL,
    PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

CREATE TABLE `councils` (
    `id` INT(10) unsigned NOT NULL,
    `DD` CHAR(20) NOT NULL,
    `CC` CHAR(20) NOT NULL,
    `text` CHAR(100) NOT NULL,
    PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

CREATE TABLE `person` (
    `id` INT(10) unsigned NOT NULL,
    `DD` CHAR(20) NOT NULL,
    `CC` CHAR(20) NOT NULL,
    `name` CHAR(100) NOT NULL,
    PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

INSERT INTO districts (`id`, `DD`, `text`) VALUES ('1','01','texas');   
INSERT INTO districts (`id`, `DD`, `text`) VALUES ('2','02','ny');   
INSERT INTO districts (`id`, `DD`, `text`) VALUES ('5','03','washington');

INSERT INTO councils (`id`, `DD`, `CC`, `text`) VALUES ('1','01','01','text1');
INSERT INTO councils (`id`, `DD`, `CC`, `text`) VALUES ('2','02','01','text2');
INSERT INTO councils (`id`, `DD`, `CC`, `text`) VALUES ('3','02','03','text4');
INSERT INTO councils (`id`, `DD`, `CC`, `text`) VALUES ('4','03','01','text5');
INSERT INTO councils (`id`, `DD`, `CC`, `text`) VALUES ('5','03','02','text6');
INSERT INTO councils (`id`, `DD`, `CC`, `text`) VALUES ('6','01','02','text7');

INSERT INTO person (`id`, `name`, `DD`, `CC`) VALUES ('1','john','02','03');
INSERT INTO person (`id`, `name`, `DD`, `CC`) VALUES ('2','mike','03','02');
INSERT INTO person (`id`, `name`, `DD`, `CC`) VALUES ('3','julia','01','02');

SELECT p.name, d.text AS district, c.text AS council
FROM person p
INNER JOIN districts d ON p.DD = d.DD
INNER JOIN councils c ON p.DD = c.DD
AND p.CC = c.CC
WHERE 1