2015-01-07 45 views
0

我有一個包含表xxx_facileforms_forms,xxx_facileforms_records和xxx_facileforms_subrecords的數據庫。來自同一個表的MySQL子查詢

爲xxx_facileforms_subrecords列標題:

id | record | element | title | neame | type | value 

至於與元件篩選記錄=「101」 ..query返回適當的記錄,但是當我添加子查詢以從同一個表filete aditional的元素=「4871」 - 返回0條記錄。

SELECT 
F.id AS form_id, 
R.id AS record_id, 
PV.value AS prim_val, 
COUNT(PV.value) AS count 
FROM 
xxx_facileforms_forms AS F 
INNER JOIN xxx_facileforms_records AS R ON F.id = R.form 
INNER JOIN xxx_facileforms_subrecords AS PV ON R.id = PV.record AND PV.element = '101' 
WHERE R.id IN (SELECT record FROM xxx_facileforms_records WHERE record = R.id AND element = '4871') 
GROUP BY PV.value 

這種妝容合適嗎?

謝謝!

編輯

感謝您的支持和想法!是的,我留下了很多猜測。抱歉。一些輸入/輸出表格數據可能有助於使其更加清晰。

_facileforms_form: 
id | formname 
---+--------- 
1 | myform 

_facileforms_records: 
id | form | submitted 
----+------+-------------------- 
163 | 1 | 2014-06-12 14:18:00 
164 | 1 | 2014-06-12 14:19:00 
165 | 1 | 2014-06-12 14:20:00 

_facileforms_subrecords: 
id | record | element | title | name|type | value 
-----+--------+---------+--------+-------------+-------- 
5821 | 163 | 101  | ticket | radio group | flight 
5822 | 163 | 4871 | status | select list | canceled 
5823 | 164 | 101  | ticket | radio group | flight 
5824 | 165 | 101  | ticket | radio group | flight 
5825 | 165 | 4871 | status | select list | canceled 

成功查詢結果:

form_id | record_id | prim_val | count 
1  | 163  | flight | 2 

所以我要返回來自那些記錄,其中_subrecord元件值數據(&總和的那些記錄) - 4871的情況下(在這種情況下163和165)。

再次謝謝你!

回答

0

不,看起來不太正確。有一個謂詞「R.id IN (subquery)」,但該子查詢本身具有參考R.id;這是一個相關的子查詢。看起來有些東西在那裏翻了一番。 (我們這裏假設id在每個表中的唯一或主鍵。)

的子查詢引用的標識符element ......我們看到該標識符唯一的其他參考距離_subrecords表(我們在_records表中沒有看到對該列的任何引用...如果_records中沒有element列,那麼這是對PV中的element列的引用,並且子查詢中的謂詞永遠不會同時爲PV.element='101'謂詞是真的。

榮譽資格將列引用與表別名混合,這使查詢(和EXPLAIN輸出)更容易閱讀;讀者不需要在表格定義中進行挖掘以找出哪個表格不包含哪些列。但請採取該模式進行下一步操作,並在查詢中限定全部列引用,包括子查詢中的列引用。

由於對element的引用不合格,我們只能猜測_records表是否包含名爲element的列。


如果目標是與element='4871'只返回從R行,我們可能只是做...

WHERE R.element='4871' 

但是,考慮到你去費心使用子查詢,我懷疑這不是你想要的。

有可能你想從R返回所有行了_form,但只適用於_form那裏有至少一個與element='4871'相關_record。我們可以得到與任一IN (subquery)EXISTS (correlated_ subquery)謂語,或anti-join模式返回的結果。我會舉出這些查詢模式的例子。我可以對規範進行一些猜測,但我只會猜測你實際想要返回的內容。

但我猜這不是你想要的。我懷疑_records實際上並不包含名爲element的列。

查詢已經限制從行與PV那些具有element='101'返回)

這是一個情況下一些示例數據和示例輸出可以幫助解釋實際的規範。這將成爲開發所需SQL的基礎。

隨訪

我只是猜測......也許你想要的東西很簡單。也許你想要返回元素值爲'101'或'4913'的行。

IN比較運算符是一種方便的表達或病症的方法,即一列等於在一個列表中的值:

SELECT F.id    AS form_id 
    , R.id    AS record_id 
    , PV.value   AS prim_val 
    , COUNT(PV.value) AS count 
    FROM xxx_facileforms_forms F 
    JOIN xxx_facileforms_records R 
    ON R.form = F.id 
    JOIN xxx_facileforms_subrecords PV 
    ON PV.record = R.id 
    AND PV.element IN ('101','4193') 
GROUP BY PV.value 

注:該查詢(如OP查詢)是使用對GROUP BY的非標準MySQL擴展,它允許在SELECT列表中返回非聚合表達式(例如裸列)。

非聚合表達式返回的值(在本例中爲F.idR.id)將是「組」中包含的行的值。但是因爲可以有多行,並且這些行上有不同的值,所以不確定性將返回哪些值。 (其它數據庫會拒絕這種說法,除非我們包裹在一個聚合函數的列,如MIN()或MAX()。)


隨訪

我注意到你加入了有關信息問題轉化爲答案......這個信息最好是加上作爲編輯的問題,因爲它不是回答這個問題。我冒昧地複製和重新格式化。

這個例子讓你更清楚你想要完成什麼。

我認爲最容易理解的是是使用EXISTS謂詞來檢查一行是否滿足某些條件「存在」或不存在,並排除行不存在的行。這將使用_subrecords表的相關子查詢,到檢查是否有匹配的行存在:(我想這就是OP不同之處是需要一個子查詢的想法爲首)

SELECT f.id    AS form_id 
    , r.id    AS record_id 
    , pv.value   AS prim_val 
    , COUNT(pv.value) AS count 
    FROM xxx_facileforms_forms f 
    JOIN xxx_facileforms_records r 
    ON r.form = f.id 
    JOIN xxx_facileforms_subrecords pv 
    ON pv.record = r.id 
    AND pv.element = '101' 
-- only include rows where there's also a related 4193 subrecord 
WHERE EXISTS (SELECT 1 
        FROM xxx_facileforms_subrecords sx 
        WHERE sx.element = '4193' 
        AND sx.record = r.id 
      ) 
-- 
GROUP BY pv.value 

鑑於查詢中存在一個GROUP BY,我們實際上可以使用常規聯接操作完成等效結果,再到第二個參考_subrecords表。

連接操作通常比使用EXISTS謂詞更有效。

(請注意,現有GROUP BY條款將消除否則可能由JOIN操作中引入的任何「重複」,所以這將返回同樣的結果。)

SELECT f.id    AS form_id 
    , r.id    AS record_id 
    , pv.value   AS prim_val 
    , COUNT(pv.value) AS count 
    FROM xxx_facileforms_forms f 
    JOIN xxx_facileforms_records r 
    ON r.form = f.id 
    JOIN xxx_facileforms_subrecords pv 
    ON pv.record = r.id 
    AND pv.element = '101' 
-- only include rows where there's also a related 4193 subrecord 
    JOIN xxx_facileforms_subrecords sx 
    ON sx.record = r.id 
    AND sx.element = '4193' 
-- 
GROUP BY pv.value 
+0

感謝您的支持和意見!可能是某些輸入/輸出表數據可能有助於您幫助我繪製corect子查詢..? – user2788571

+0

我不確定你需要一個子查詢。我在規範中沒有看到任何讓我相信子查詢或內聯視圖是必需的。 (我懷疑你可能想要一些非常簡單的東西......比如用'element ='101''返回行以及'element ='4193''的行,並且這不需要子查詢 – spencer7593

+0

有了額外的我們可以推薦幾個可能的查詢來返回想要的結果,我已經更新了我的答案,以包含兩個備選方案:使用'EXISTS(相關子查詢)'並使用常規聯接操作 – spencer7593

0

感謝您的支持和想法!是的,我留下了很多猜測..對不起。所以可能會有一些輸入/輸出表數據可能有所幫助。

_facileforms_form:

頭 - > ID | formname

1 | myForm的

_facileforms_records:

頭 - > ID |表格|提交

163 | 1 | 2014-06-12 14:18:00

164 | 1 | 2014-06-12 14:19:00

165 | 1 | 2014年6月12日14時20分零零秒

_facileforms_subrecords

頭 - > ID |記錄|元素|標題|名稱|鍵入|值

5821 | 163 | 101 | ticket |廣播組航班

5822 | 163 | 4871 |狀態|選擇列表|取消

5823 | 164 | 101 | ticket |廣播組航班

5824 | 165 | 101 | ticket |廣播組航班

5825 | 165 | 4871 |狀態|選擇列表|取消


成功的查詢結果:

頭 - > form_id | record_id | prim_val | count

1 | 163 |航班| 2

所以我必須從_subrecord元素 - 4871(在這種情況下爲163和165)的記錄返回值數據(&總和那些記錄)。

再次謝謝你!

+0

這不是問題的答案*。有關*問題*的其他信息應添加到問題本身。我冒昧地將這些信息複製並重新格式化爲問題。 – spencer7593

相關問題