2014-03-31 54 views
0

我想从表中的一个,AKA ship_skill_tree返回所有的结果,同时匹配了在表中的两个中的行,AKA character_sheet_skills即使表格2中不存在行。返回所有行从表中的一个,即使表中的两个是空的或部分结果发现

SELECT c.`level` , t.`skillLevel` AS levelNeeded, i.`typeName` 
FROM `ship_skill_tree` t 
LEFT JOIN `character_sheet_skills` c ON t.`skillTypeID` = c.`typeID` 
LEFT JOIN `invTypes` i ON i.`typeID` = t.`skillTypeID` 
WHERE t.`shipTypeID` = 11176 AND c.`character_id` = 1; 

表的一个数据:

|shipTypeID|shipGroupID|skillTypeID|skillLevel 
______________________________________________ 
|11011|26|3332|1 
|11129|31|3327|1 
|11132|31|3327|1 
|11134|31|3327|1 
|11172|830|3328|5 
|11172|830|12093|1 
|11174|893|3328|5 
|11174|893|28615|1 
|11176|831|3330|5 
|11176|831|12092|1 

表两个数据:

|character_id|typeID|skillpoints|level|published 
______________________________________________ 
|1|3300|1415|2|1 
|1|3301|8000|3|1 
|1|3327|256000|5|1 
|1|3330|2829|2|1 
|1|3340|181020|4|1 
|1|3341|1024000|5|1 
|1|3342|32000|3|1 
|1|3343|32202|3|1 
|1|3380|256000|5|1 
|1|3385|256000|5|1 
|1|3386|256000|5|1 
|1|3392|256000|5|1 
|1|3394|90514|4|1 
|1|3402|256000|5|1 
|1|3410|768000|5|1 
|1|3411|135765|4|1 
|1|3412|750|1|1 
|1|3413|256000|5|1 
|1|3416|45255|4|1 
|1|3417|0|0|1 
|1|3418|0|0|1 
|1|3419|135765|4|1 
|1|3420|181020|4|1 
|1|3423|0|0|1 
|1|3425|90510|4|1 
|1|3426|45255|4|1 
|1|3428|500|1|1 
|1|3429|8000|3|1 
|1|3436|45255|4|1 
|1|3437|45255|4|1 
|1|3438|500|1|1 
|1|3449|256000|5|1 
|1|3453|0|0|1 
|1|3455|256000|5|1 
|1|3456|226275|4|1 
|1|11579|271530|4|1 
|1|12186|0|0|1 
|1|12187|0|0|1 
|1|12188|0|0|1 
|1|12190|22547|3|1 
|1|12191|45255|4|1 
|1|12192|45255|4|1 
|1|12193|45255|4|1 
|1|12195|45255|4|1 
|1|16281|256000|5|1 
|1|17940|1024000|5|1 
|1|20342|1280000|5|1 
|1|22551|40000|3|1 
|1|22578|181020|4|1 
|1|25739|0|0|1 
|1|26252|16000|3|1 
|1|26253|750|1|1 
|1|26261|750|1|1 
|1|32918|16000|3|1 

invTypes表:

|typeID|typeName 
________________ 
|3327|Spaceship Command 
|3328|Gallente Frigate 
|3330|Caldari Frigate 
|3332|Gallente Cruiser 
|12092|Interceptors 
|12093|Covert Ops 
|28615|Electronic Attack Ships 

在上述查询shipTypeID将总是或应该始终有效并匹配表1中的记录,但是,在表2中,匹配的行可能不存在。我需要的是输出如下:

|level|levelNeeded|typeName 
___________________________ 
|2|5|Caldari Frigate 
|NULL|1|Interceptors 

目前,这是返回什么:

|level|levelNeeded|typeName 
___________________________ 
|2|5|Caldari Frigate 

编辑:解决方案!

SELECT c.`level` , t.`skillLevel` AS levelNeeded, i.`typeName` 
FROM `ship_skill_tree` t 
LEFT JOIN `character_sheet_skills` c ON t.`skillTypeID` = c.`typeID` AND c.`character_id` = 1 
INNER JOIN `invTypes` i ON i.`typeID` = t.`skillTypeID` 
WHERE t.`shipTypeID` = 11176 
+0

哪里是'typeName'在样本数据? – Barmar

+0

JOIN条件应放在'ON'子句中,而不是'WHERE'子句中。 – Barmar

+0

@Barmar,那是一个备用SQL,它最初是在WHERE,我将它切换到测试,我将在原始文章中更正。 – 0mni

回答

1

您需要对ON子句中加入的表进行任何限制。如果将它们放在WHERE子句中,则它不起作用,因为没有任何匹配的行将为这些列生成NULL,而WHERE子句将它们过滤掉。

SELECT c.`level` , t.`skillLevel` AS levelNeeded, i.`typeName` 
FROM `ship_skill_tree` t 
LEFT JOIN `character_sheet_skills` c ON t.`skillTypeID` = c.`typeID` AND c.`character_id` = 1 
LEFT JOIN `invTypes` i ON i.`typeID` = t.`skillTypeID` 
WHERE t.`shipTypeID` = 11176 

DEMO

+0

这就是我曾经工作过的[DEMO](http://www.sqlfiddle.com/ #!2/9c717f/2/0) – 0mni

+0

在你的演示中,你有第二个表的'NOT NOT NULL'检查。如果您要过滤掉空行,您可以使用INNER JOIN而不是LEFT JOIN。请参阅[DEMO](http://www.sqlfiddle.com/#!2/9c717f/4) – Barmar

+0

谢谢:)做了这项工作。 – 0mni

0

您需要使用右连接或外连接而不是左连接。请仔细阅读Visual Representation of SQL Joins以获得良好的概述

+0

这是倒退。 LEFT JOIN返回表1中的行,表2中不匹配。RIGHT JOIN返回表2中的行,表1中没有匹配。 – Barmar

相关问题