mysql - 我在连接3个MySQL表时遇到问题,如何改善语法?

标签 mysql database join

我正在尝试在MySQL数据库中加入3个不同的表。我已经设法在有限的列上加入了2个表,但是我试图访问这些表中的所有列,以便将结果数据发布到网页上。我觉得我已经尝试了所有可能的联接组合,从内部联接到左外部联接和右外部联接。我已经研究过在表之间进行联合,但是我读到要使它们能正常工作,您需要具有相同数量的列,并且表中的列数量也不相同。

以下是有关我要加入的表的信息以及尝试查询数据库时使用的语法。

表格:

Breeds -> 10 columns, Breed_Name is a Unique Key and links to the other two tables.
Lifestyle -> 11 Columns, Breeds.Breed_Name is a foreign Key to the Lifestyle.Breed Column
Temperament -> 10 Columns, Breeds.Breed_Name is a foreign Key to the Temperament.Breed Column


MySQL语法

Select B.*, L.*, T.*
From Breeds as B
Right Outer Join Lifestyle as L on B.`Breed_Name` = L.`Breed`
Right Outer Join Temperament as T on B.`Breed_Name` = T.`Breed`
Where B.`Breed_Name` = "German Shepherd Dog"


我设法在某种程度上解决了这个问题,但是后来我做了一些更改(甚至不知道是什么),并且一切都停止了工作,而且我还没有找回它。但是奇怪的是,我能够使用“右外连接”从“品种和气质”中获取信息,但是无论我使用何种连接,都无法从“生活方式”中获取任何信息。当然,现在所有这些都不起作用。

我对联接类型没有足够的了解。我不明白为什么我们有不同的类型。我表中的信息是不同的,由于外键,它们仅在几列中匹配。如果可以的话,我会进行完全联接,因为我认为这是我真正需要的,但是MySQL不会进行完全联接(最后检查)。当我想要所有表中的所有信息时,如何确定需要哪种联接?

备查:

如果我设法使该查询正常工作,是否可以将查询扩展到所需的尽可能多的不同表?继续做:

(join-type) *This table* on table1.`column` = table2.`column`


还是在单个查询期间可能需要多种联接类型?如果是这样,您如何决定使用哪个?

编辑:

我已经处理了一些查询,如果删除了WHERE B. Breed_Name = "German Shepherd Dog",那么我回到了代码停止工作时的状态。但是我仍然无法访问Lifestyle中的信息。我的WHERE语句有什么问题?是在错误的地方吗?我知道您可以在加入表时执行WHERE语句。 。 。

编辑2:

(只是让您对这些答案的帮助有所了解)

关于WHERE语句中单引号的答案的某些问题使我的整个页面消失了,我认为只有在语法有误的情况下,这种情况才会发生。如果我删除WHERE语句,奇怪的是所有答案都起作用。一个答案建议一个内部联接,一个建议一个左联接,一个建议仅联接,并且在某种程度上,如果没有WHERE语句,它们都会起作用。什么?一个答案在WHERE中使用了STRCMP,这似乎可行,但是我不明白这是什么(很好),而是希望使用简单的WHERE语句。有什么办法吗?

编辑3

我不知道发生了什么,但是现在我的Where语句正在工作,并且多个语法版本正在工作。数据库是否可以缓存结果而不显示更改?在我什么都无法工作之前,我感到困惑,但现在几乎所有东西似乎都在工作?以下3个代码均有效:

的MySQL

SELECT *
FROM `Breeds` as B
Left JOIN `Lifestyle` AS L ON B.`Breed_Name` = L.`Breed`
Left JOIN `Temperament` AS T ON B.`Breed_Name` = T.`Breed`
Where B.`Breed_Name` = "German Shepherd Dog"

SELECT *
FROM `Breeds` as B
inner JOIN `Lifestyle` AS L ON B.`Breed_Name` = L.`Breed`
inner JOIN `Temperament` AS T ON B.`Breed_Name` = T.`Breed`
Where B.`Breed_Name` = "German Shepherd Dog"

SELECT *
FROM `Breeds` as B
JOIN `Lifestyle` AS L ON B.`Breed_Name` = L.`Breed`
JOIN `Temperament` AS T ON B.`Breed_Name` = T.`Breed`
Where B.`Breed_Name` = "German Shepherd Dog"


虽然我很高兴它能奏效,但由于我不知道如何工作而感到沮丧。而且我以为在尝试提供多个表时必须使用Select B.*, L.*, T.*,为什么简单的Select *可以工作?而且我不明白为什么我的WHERE语句在以前没用过时突然起作用。可能是因为语法有细微变化吗?现在,表名前后都用引号引起来。

我期待阅读更多的答案,并感谢您迄今为止提供的所有帮助。

最佳答案

在MySQL中,这应该可以帮助您。不知道表的实际结构如何,这只是一个近似值。

SELECT *
FROM `Breeds` as B
JOIN `Lifestyle` AS L ON B.`Breed_Name` = L.`Breed`
JOIN `Temperament` AS T ON B.`Breed_Name` = T.`Breed`
WHERE B.`Breed_Name` = 'German Shepherd Dog';


让我知道这是否使您接近。

(编辑)看到您的编辑,在MySQL中使用单引号指定您的谓词是字符串。

关于mysql - 我在连接3个MySQL表时遇到问题,如何改善语法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31329445/

相关文章:

php - 试图在 sql 查询中获取非对象的属性

php - 使用 PHP 检查 MySQL 数据库是否为空

mysql - 将两列连接到相同的第三列

php - 仅将 csv 上传到 mysql 选定的列 - laravel

mysql - SQL 表连接,查询问题

php - 复杂查询+分页脚本

MySQL - 从表中删除空值行

php - 如果另一张表中不存在记录,则插入到一张表中

mysql - 'where not exists clause' 中的未知列

ajax - 使用 AJAX 检查数据库更新并通知