2016-07-01 139 views
1

我有兩個頻道。多個查詢,或嵌套?

第一個頻道是'預訂'。這包含member_idtour_id

第二個頻道是'遊覽'。這包含了上述tour_id參考的旅行細節。

我需要查詢「旅遊」頻道內的字段,獲取tour_id以滿足查詢。然後我需要找到所有'預訂'條目,其中tour_id匹配其中一個查詢爲真。

完成兩個SQL查詢或嵌套查詢會更好嗎?如果嵌套,如何?


exp_channel_data | CHANNEL_ID | entry_id | field_id_1 | ... |

exp_channel_titles | channel_id | entry_id | author_id | ... |

SELECT titles.author_id 
FROM exp_channel_data AS tours 
LEFT JOIN exp_channel_titles AS titles ON bookings.entry_id = titles.entry_id 
LEFT JOIN exp_channel_data AS bookings 
    ON tours.entry_id = bookings.entry_id 
    AND bookings.channel_id = '17' 
WHERE tours.channel_id = '5' 
AND tours.field_id_34 = 'DSV04' 

$sql_1 = " 
    SELECT entry_id 
    FROM exp_channel_data 
    WHERE field_id_34 LIKE 'adas%' 
"; 

$query_1 = ee()->db->query($sql_1); 
$test = $query_1->result_array(); 

$uids = Array(); 
foreach($test as $u) $uids[] = $u['entry_id']; 
$list = implode(",",$uids); 


$sql_2 = " 
    SELECT ct.author_id 
    FROM exp_channel_data AS cd 
    LEFT JOIN exp_channel_titles AS ct ON cd.entry_id = ct.entry_id 
    WHERE field_id_227 IN ($list) 
"; 

$query_2 = ee()->db->query($sql_2); 
$test_2 = $query_2->result_array(); 
+0

示例輸入輸出需要徹底理解。 – 1000111

+0

channel = table?聽起來像一個連接到我,但樣本輸入/輸出會讓事情變得清晰...'SELECT b.member_id FROM tours t LEFT JOIN booking b ON t.tour_id = b.tour_id WHERE t.field1 ='abc'AND t.field2 ='def'' – hsan

+0

@hsan謝謝。這兩個通道數據都在同一個表中,所以我不認爲我可以使用JOIN。表中有一個名爲'channel_id'的列,我可以用它來定位每個列。 – ccdavies

回答

2

假設表的結構是這樣的:

|channel_id|tour_id|member_id|field1|...| 
----------------------------------------- 
|tours  |1  |NULL  |abc | | 
|tours  |2  |NULL  |def | | 
|booking |1  |1  |  | | 
|booking |1  |2  |  | | 
|booking |2  |3  |  | | 

您可以加入該表到自身上而得到你正在尋找...

SELECT 
    booking.tour_id 
    booking.member_id 
FROM 
    my_table tours 
    LEFT JOIN my_table booking 
     ON tours.tour_id = booking.tour_id 
     AND booking.channel_id = 'booking' 
WHERE 
    tours.channel_id = 'tours' 
    AND tours.field1 = 'abc' 
結果

EDIT作爲後續更新問題

我的理解是:

  • 要找到作者所有預訂所有旅遊其中field_id_34始於「 ADAS」。
  • 作者預訂的被保持在表exp_channel_titles
  • 預訂旅行團被保持在表exp_channel_data和列channel_id用於預訂(17)和旅行團(區分5)。
  • 預訂旅遊旅遊entry_id預訂field_id_227
  • 預訂作者被預訂的entry_id鏈接和entry_idexp_channel_titles
  • 鏈接

所以這應該給你的lis t作者在一個查詢中:

SELECT 
    titles.author_id 
FROM 
    exp_channel_data tours 
    LEFT JOIN exp_channel_data bookings 
     ON bookings.channel_id = 17 
     AND bookings.field_id_227 = tours.entry_id 
    LEFT JOIN exp_channel_titles titles 
     ON titles.entry_id = bookings.entry_id 
WHERE 
    tours.channel_id = 5 
    AND tours.field_id_34 LIKE 'adas%' 
+0

謝謝hsan。我已經對問題進行了調整,以顯示錶格列中我如何使用您的答案。 'author_id'位於'exp_channel_titles'表中,因此在確定哪個「預訂」頻道條目符合查詢條件後,我需要通過'entry_id'以某種方式獲取此作者ID。我嘗試添加一個額外的LEFT JOIN,但這不起作用。有任何想法嗎? – ccdavies

+0

你應該切換連接。在與標題連接時,在查詢中甚至知道它之前,請參考預訂表。 – hsan

+0

我一直無法用你的例子來解決這個問題。請參閱編輯我的問題與兩個查詢的工作示例。也許這將有助於解釋我正在嘗試做什麼? – ccdavies