Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 多SQL连接难以查询_Mysql_Sql_Sql Server_Join_Inner Join - Fatal编程技术网

Mysql 多SQL连接难以查询

Mysql 多SQL连接难以查询,mysql,sql,sql-server,join,inner-join,Mysql,Sql,Sql Server,Join,Inner Join,我有一个奇怪的模式,但当它被设计时,它当时似乎是个好主意。我有一个主表,lesson\u objects,它有外键链接到词汇表、视频表和测验表 语音表: CREATE TABLE `se_vocab` ( `id` INT(11) NOT NULL AUTO_INCREMENT, `vocab_word` VARCHAR(255) NOT NULL, `vocab_audio` INT(10) NULL DEFAULT '0', `vocab_image` INT

我有一个奇怪的模式,但当它被设计时,它当时似乎是个好主意。我有一个主表,
lesson\u objects
,它有外键链接到词汇表、视频表和测验表

语音表:

CREATE TABLE `se_vocab` (
    `id` INT(11) NOT NULL AUTO_INCREMENT,
    `vocab_word` VARCHAR(255) NOT NULL,
    `vocab_audio` INT(10) NULL DEFAULT '0',
    `vocab_image` INT(10) NULL DEFAULT '0',
    PRIMARY KEY (`id`)
)
CREATE TABLE `se_video` (
    `id` INT(10) NOT NULL AUTO_INCREMENT,
    `video_name` VARCHAR(255) NOT NULL,
    `video_description` MEDIUMTEXT NOT NULL,
    `video_file_name` VARCHAR(50) NULL DEFAULT NULL,
    `video_url` VARCHAR(255) NOT NULL,
    PRIMARY KEY (`id`)
)
CREATE TABLE `se_quizzes` (
    `id` INT(11) NOT NULL AUTO_INCREMENT,
    `quiz_name` VARCHAR(80) NOT NULL,
    `quiz_description` TINYTEXT NULL,
    PRIMARY KEY (`id`)
)
视频表:

CREATE TABLE `se_vocab` (
    `id` INT(11) NOT NULL AUTO_INCREMENT,
    `vocab_word` VARCHAR(255) NOT NULL,
    `vocab_audio` INT(10) NULL DEFAULT '0',
    `vocab_image` INT(10) NULL DEFAULT '0',
    PRIMARY KEY (`id`)
)
CREATE TABLE `se_video` (
    `id` INT(10) NOT NULL AUTO_INCREMENT,
    `video_name` VARCHAR(255) NOT NULL,
    `video_description` MEDIUMTEXT NOT NULL,
    `video_file_name` VARCHAR(50) NULL DEFAULT NULL,
    `video_url` VARCHAR(255) NOT NULL,
    PRIMARY KEY (`id`)
)
CREATE TABLE `se_quizzes` (
    `id` INT(11) NOT NULL AUTO_INCREMENT,
    `quiz_name` VARCHAR(80) NOT NULL,
    `quiz_description` TINYTEXT NULL,
    PRIMARY KEY (`id`)
)
测验表:

CREATE TABLE `se_vocab` (
    `id` INT(11) NOT NULL AUTO_INCREMENT,
    `vocab_word` VARCHAR(255) NOT NULL,
    `vocab_audio` INT(10) NULL DEFAULT '0',
    `vocab_image` INT(10) NULL DEFAULT '0',
    PRIMARY KEY (`id`)
)
CREATE TABLE `se_video` (
    `id` INT(10) NOT NULL AUTO_INCREMENT,
    `video_name` VARCHAR(255) NOT NULL,
    `video_description` MEDIUMTEXT NOT NULL,
    `video_file_name` VARCHAR(50) NULL DEFAULT NULL,
    `video_url` VARCHAR(255) NOT NULL,
    PRIMARY KEY (`id`)
)
CREATE TABLE `se_quizzes` (
    `id` INT(11) NOT NULL AUTO_INCREMENT,
    `quiz_name` VARCHAR(80) NOT NULL,
    `quiz_description` TINYTEXT NULL,
    PRIMARY KEY (`id`)
)
课程对象(包含以前表格的外键)

我正在尝试创建一个查询,该查询返回来自lesson_对象的所有记录,但也包括该记录中类型(词汇表等)列中的数据

例如:

只有我的查询不返回行,而理想情况下,它应该返回多行,每个记录都包含一些空列。例如,如果不是词汇表,则测验和视频的列将为空

我的尝试非常糟糕,但这里有一个是为了指导:

SELECT 
    lo.id, lo.section_object_type, lo.section_object_id, 
    vo.id, vo.vocab_text, vo.vocab_image, vo.vocab_audio
    vi.id, vi.video_name, vi.video_url,
    q.id, q.quiz_name
    FROM se_lesson_org lo, se_vocab vo, se_video vi, se_quizzes q
    WHERE lo.section_object_id = vo.id 
    OR lo.section_object_id = vi.id
    OR lo.section_object_id = q.id

如有任何帮助/意见,将不胜感激。谢谢。

使用
LEFT JOIN
返回
se\u lesson\u org
中的所有行。此外,添加一个
JOIN
条件以匹配特定的
节对象类型

SELECT
    lo.*,
    vo.*,
    vi.*,
    q.*
FROM se_lesson_org lo
LEFT JOIN se_vocab vo
    ON vo.id = lo.section_object_id
    AND lo.section_object_type = 'vocabulary'
LEFT JOIN se_video vi
    ON vi.id = lo.section_object_id
    AND lo.section_object_type = 'video'
LEFT JOIN se_quizzes q
    ON q.id = lo.section_object_id
    AND lo.section_object_type = 'quiz'


注意:避免使用旧式联接语法。阅读Aaron Bertrand的文章。

听起来像是在每个表上寻找一个
左连接。这样,如果外键有效,则显示值;如果外键无效,则相关列的值将为NULL

SELECT 
    lo.id, lo.section_object_type, lo.section_object_id, 
    vo.id, vo.vocab_text, vo.vocab_image, vo.vocab_audio
    vi.id, vi.video_name, vi.video_url,
    q.id, q.quiz_name
    FROM se_lesson_org lo
    LEFT JOIN se_vocab vo ON vo.id = lo.section_object_id 
        AND lo.section_object_type = 'vocabulary'
    LEFT JOIN se_video vi ON vi.id = lo.section_object_id 
        AND lo.section_object_type = 'video'
    LEFT JOIN se_quizzes q ON q.id = lo.section_object_id 
        AND lo.section_object_type = 'quiz'

还请注意,此语法清楚地说明了每个表是如何连接到查询的其余部分的,而不是在末尾的WHERE子句中有一大堆条件。

显示示例数据或创建SQLFIDDLE请发布预期结果格式。MySQL或/和SQL Server?不要给未涉及的产品贴标签@jarlh从技术上讲,它是Google SQL存储,但这不是一个选项,所以它是SQL和mysql的混合体(我的最佳选择)。对不起,我不是想发垃圾邮件,太棒了。工作完美。我来看看那篇文章。谢谢没问题,很高兴我能帮忙。文章不错,@wewesthemenace。他所说的
*=,=*
是什么意思?可能是个愚蠢的问题,但我在他引用的查询中没有看到……这只是
OUTER-JOIN
的旧式语法。请注意,本文是针对
SQLServer
(MSSQL)的,但该原则可以应用于所有RDBMs。非常好,感谢您的解释。我想这就是为什么我这学期要上SQL课的原因。