2015-05-18 78 views
0

我的MySQL表如下所示:MySQL的:獲取基於一個行的值多行

enter image description here

我希望得到的結果,所有的以下是滿意:

  • form_id是1
  • 排序lead_id從高到低
  • field_number 9爲該lead_id必須是111

總之,我的查詢應該返回9行。那可能嗎?

這是我迄今爲止的嘗試,但我真的希望儘可能避免使用GROUP_CONCAT以獲得更清晰的結果集。

SELECT lead_id, GROUP_CONCAT(field_number, "|", value SEPARATOR "----") AS `values` 
FROM lead_detail 
WHERE form_id = 1 
GROUP BY lead_id 
ORDER BY lead_id DESC 
+1

你能澄清一下你的意思嗎?'field_number' 9對於'lead_id'必須是111「? – adriann

+0

Ahhh ....使用SQL使用EAV模型的*喜歡*。 – spencer7593

回答

1

如果你意思是你要包括只爲lead_id行如存在與field_number=9value=111lead_id一行。否則,對於lead_id所有行應被排除在外......

你可以做這樣的事情:

SELECT d.id 
    , d.lead_id 
    , d.form_id 
    , d.field_number 
    , d.value 
    FROM (SELECT e.lead_id 
      FROM lead_detail e 
      WHERE e.form_id  = 1 
      AND e.field_number = 9 
      AND e.value  = 111 
      GROUP BY e.lead_id 
     ) f 
    JOIN lead_detail d 
    ON d.lead_id = f.lead_id 
    AND d.form_id = 1 
ORDER BY d.lead_id DESC 

內聯視圖(別名爲f)返回符合特定標準的lead_id明顯名單。我們可以引用來自表格的結果,並在JOIN操作中使用該結果來返回lead_detail表中的「匹配」行。 (如果有特定lead_id沒有行與value=111field_number=9form_id=1,然後線視圖不會在列表返回lead_id。)


又或者,我們可以使用一個EXISTS謂詞相關子查詢,但是這可能不執行,以及:

SELECT d.id 
    , d.lead_id 
    , d.form_id 
    , d.field_number 
    , d.value 
    FROM lead_detail d 
WHERE d.form_id = 1 
    AND EXISTS 
     (SELECT 1 
      FROM lead_detail e 
      WHERE e.form_id  = 1 
      AND e.field_number = 9 
      AND e.value  = 111 
      AND e.lead_id  = d.lead_id 
     ) 
ORDER BY d.lead_id DESC 

這實際上是說,從lead_detail每一行運行存在的關鍵字之後的子查詢...如果子查詢返回一個(或多個)行,然後E XISTS謂詞返回TRUE,否則返回FALSE。通過WHERE子句中的謂詞,該子查詢與外部查詢「關聯」,從外部查詢的行中將lead_id與值lead_id相匹配。

+0

子查詢缺少「e」別名。 – farjam

+0

@farjam:是的,我的壞。內聯視圖查詢和存在子查詢確實缺少別名分配。我會糾正這一點。謝謝!我給出了只有兩個查詢模式的例子,還有其他模式也可以工作,例如'd.lead_id IN(subquery)'代替EXISTS, – spencer7593

0

簡短的回答是「不容易」。有幾個方法可以做到這一點,是不是超級簡單 - 也許是最簡單是一個子查詢(具體格式將根據你的表的確切格式改變等)

SELECT lead_id, GROUP_CONCAT(field_number, "|", value SEPARATOR "----") AS `values` 
FROM lead_detail 
WHERE `form_id` = 1 
AND `lead_id` = (SELECT `lead_id` FROM `lead_detail` WHERE `field_number` = 9 AND `value` = 111 AND `form_id` = 1) /*This is the subquery*/ 
GROUP BY lead_id 
ORDER BY lead_id DESC 

其他選項包括運行兩個單獨的查詢,一個用於提取form_id(或form_ids)問題,另一個用於提取form_id(或那些form_ids)的所有數據。

+0

運行查詢後出現以下錯誤:子查詢返回多於1行 – farjam

+0

@farjam:您觀察到的行爲是預期的。最快的解決方法是在子查詢前用「**'IN' **」替換「**'='**」。 – spencer7593