2014-03-31 53 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

相關問題