2011-12-09 105 views
0

我有一個表正確的方式來做到這一點查詢

形式( INT ID) webformsystemflags(INT ID,INT formid INT sysflagid)

sysflag(INT ID,名稱char(10) )

形式表是具有所有形式

網絡表單是具有具有標誌的形式的表的表適用於它。它有一個外部formid,它是表單表和sysflagid,它是sys標誌表的外部關鍵字

sys標誌是包含標誌的表。可以說我有標誌定義爲1,2,3 我可以有沒有應用到它的所有標誌的表格,有些可能有1,有些可能有2或有些可能有3應用於它或有些可能有沒有。

我怎樣才能找到所有的形式有標誌1或標誌2或標誌3適用於它?

+0

從查看提供的答案,以及您做什麼/不想要的,這是它。你想知道哪種形式有任何標誌1,2 3(一個或多個)....或...你在尋找沒有特定標誌的表格。他們是完全不同的查詢。 – DRapp

+0

我正在尋找沒有應用特定/特定標誌的表單。 – allthenutsandbolts

+0

我更新了我的答案,根據您最後的評論,它提取的表格只有1個應用,而不是2或3。從中您可以定製您的查詢以找到表單標記2而不是1或3等。 –

回答

1

這是找到排除的常用技巧。我在下面的「FlagYouAreExpectingTo_ NOT _Exist」的值顯然是你期望不在那裏的那個值。這是它的工作原理。

獲取每個表單和左連接到Web系統標誌表與查找匹配的表單,並設置你不想要的標誌。如果找到表單和標誌的有效條目,則(wsf)表中的「formid」將存在。所以,我們希望所有不存在的,因此關閉WHERE wsf.formid爲空。

對於未被標記的地方,它將爲NULL。

​​
0

您可以使用exists子句來拉記錄是這樣的:

select a.* 
from form a 
where exists (select 1 
       from webformsystemflags 
       where formid = a.id 
       and sysflagid IN (1,2,3)) 

這不會給你相關的標誌。如果你想要:

select a.*, b.sysflagid 
from form a 
join (select formid, sysflagid 
      from webformsystemflags 
      where sysflagid in (1,2,3)) b 
on a.id = b.formid 

有很多不同的方法來解決這個問題。

編輯:通過閱讀對其他答案的評論似乎問題不清楚。你想要只有一個標誌的結果表單?即表格有標誌1但不是2或3?

EDIT2:如果你真的只是想真/假查詢拉動只有真正的(有標誌):

select a.*, b.sysflagid 
from form a 
join webformsystemflags b on a.id = b.formid 

如果你想形式,而不標誌:

select a.* 
from form a 
left join webformsystemflags b on a.id = b.formid 
where b.formid is null 

EDIT3:基於在評論上,形式與一個國旗,而不是其中一個:

select a.* 
from form a 
where exists (select 1 from webformsystemflags where formid = a.id and sysflagid = 1) 
and (
    not exists (select 1 from webformsystemflags where formid = a.id and sysflagid = 2) 
    or 
    not exists (select 1 from webformsystemflags where formid = a.id and sysflagid = 3) 
) 
+0

我很好奇fosco - 與我提到的基本子查詢相比,此方法的效率如何?我自己從來沒有發現需要使用存在的句子,它看起來在語法上是不必要的。但是,它可能非常有效得多。你知道嗎? ps - 這不是一個諷刺評論我真的好奇 –

+0

@KaiQing我一直在使用'存在'條款多年,它是許多工作的正確工具。我目前無法與您的查詢進行比較,因爲它沒有返回正確的結果。如果你更新你的答案,我可能會畫出一些比較。 – Fosco

+0

這是說:「我怎樣才能找到所有的形式有標誌1或標誌2或標誌3適用於它?一些可能有1,一些可能有2或一些可能有3適用於它或有些可能沒有「。我的示例中的第一個子查詢確實會返回任何帶有任何標誌的表單。這個問題表明,只有1 2或3,如此批准,是的,我的例子僅限於真或假,並非特定於1,2或3.如果有無限數量的sysformid,那麼它是不準確的。但是對於我的問題,我認爲sysflagid只有1,2或3個。 –

1

您可以使用子查詢:

SELECT * FROM `form` WHERE `id` IN (SELECT `formid` FROM `webformsystemflags`) 

慎用雖然在大型數據庫子查詢。你可以用連接做同樣的事情,但這是一個簡單的解決方案,可以幫助你。

或者對於不具有一定的標誌的所有結果:

SELECT * FROM `form` WHERE `id` IN (SELECT `formid` FROM `webformsystemflags` WHERE `sysflagid` != 1 OR `sysflagid` != 2) 

或加入方法:

SELECT f.*, r.`sysflagid` FROM `form` f LEFT JOIN `webformsystemflags` r ON r.`formid` = f.`id` WHERE r.`sysflagid` != null 

將讓你的表格和相關標誌。但是,如果表單上有多個標誌,它將不會在一行中獲得所有標誌。那你可能需要在旗幟上做一個concat,但這個答案已經越來越不必要地複雜了。

* 最後的編輯*

好nutsandbolts - 你需要更新你的問題使我們兩個人做的過了頭自己在許多不同的查詢,它是不是真的幫助回來說,它不給出正確的結果。通過簡單地檢查我們提供的查詢並使用它們後面的一般邏輯來撰寫適合您的查詢,就可以輕鬆獲得正確的結果。

所以,我的最後一個建議 - 你說你想要一個查詢,將返回一個形式IF它應用了一定的標誌,是不已應用到它的其他標誌。

這是假設你想要的一切形式的爲1的標誌,並且不是2或3或無:

SELECT f.*, r.`sysflagid` FROM `form` f LEFT JOIN `webformsystemflags` r ON r.`formid` = f.`id` WHERE r.`sysflagid` =1 AND r.`formid` NOT IN (SELECT `formid` FROM `webformsystemflags` WHERE `sysflagid` = 2 OR `sysflagid` = 3) 

因爲你webformsystemflags是關係這個查詢將不會返回不中存在的任何形式webformsystemflags表 - 所以你不需要考慮null。

如果這不是你正在尋找的,我強烈建議你以絕對和完美的清晰度重寫你的問題,因爲你需要的原因之後,我退出了這個對話。儘管你很幸運。玩的開心。

+0

這會給我應用標誌的記錄。我需要有一個不適用的特定標誌的記錄 – allthenutsandbolts

相關問題