2016-01-14 50 views
0

我想在下面的SQL查詢與油滑3.0兩個加入與同桌油滑3.0

select cm_buyer.conversation_id 
from conversations c 
inner join conversation_members cm_buyer on cm_buyer.conversation_id = c.id 
inner join conversation_members cm_seller on cm_buyer.conversation_id = cm_seller.conversation_id 
where (cm_buyer.talker_id = "7LUhaK" 
and cm_buyer.is_buyer = 1) 
and c.`product_id` = "2" 
and (cm_seller.`talker_id` = "BBBBBB" and cm_seller.is_buyer = 0); 

我是新來的油滑,我從來沒有在MySQL的超級裂紋,所以我這裏需要一些幫助。正如你所看到的,我正在從對話表到對話表conversation_members進行兩次連接。

我做這樣的事情:

val sellerId = TalkerId("7LUhak") 
val buyerId = TalkerId("BBBBBB") 
val conversationMembers = TableQuery[ConversationMemberTable] 
val conversations = TableQuery[ConversationTable] 

val query = for { 
    a <- conversations join conversationMembers on (_.id === _.conversationId) 
    // SOME MAGIC HERE 
} yield (something) 

PersistenceUtils.run(query.result) 

我已經做了這兩個表查詢(添加,簡單的選擇...)一些基本的查詢,所以映射正確。我一直試圖做的魔術節這麼多東西沒有運氣:(

你能幫我嗎?

謝謝!

塞爾吉

回答

1

在光滑它是所有關於混合和組合查詢(未經測試的例子):

val conversationMembers = TableQuery[ConversationMemberTable] 
val conversations = TableQuery[ConversationTable] 

val sellerQuery = conversationMembers.filter(b => b.talkerId === "7LUhaK" && b.isBuyer === 1) 
val buyerQuery = conversationMembers.filter(s => s.talkerId === "BBBBBB" && s.isBuyer === 0) 

val query = for { 
    c  <- conversations.filter(_.productId === 2) 
    buyer <- buyerQuery if c.id === buyer.conversationId 
    seller <- sellerQuery if buyer.conversationId === seller.conversationId 
} yield buyer 

val action = query.map(_.conversationId).result // omit .map(...) to fetch the whole model instead 
PersistenceUtils.run(action) 

正如你可以看到我在一個單子結合了三個查詢的連接使用的理解。你可以把甚至furt。她在另一個數據庫查詢中重用query等等。實際上,當我將Conversation映射到它的id(query.map(_.conversationId))時,我做到了這一點。

Slick在開始的時候有點難以理解,尤其是當你習慣了ORM的Hibernate,但是我希望你有一個總體思路。

+0

謝謝你,我已經在其他的方式(我認爲)這樣做,但 – SergiGP

1

我終於做到這一點,它的工作原理:d

val conversationMembers = TableQuery[ConversationMemberTable] 

val query = for { 
    c <- conversations if c.productId === productId 
    cmBuyer <- conversationMembers if c.id === cmBuyer.conversationId && cmBuyer.talkerId === buyerId && cmBuyer.isBuyer === true 
    cmSeller <- conversationMembers if c.id === cmSeller.conversationId && cmSeller.talkerId === sellerId && cmSeller.isBuyer === false 
} yield (c) 



PersistenceUtils.run(query.result) 
+1

你猜對了,我會檢討你的解決方案:)你做的完全一樣的除了你的代碼之外的東西比我的簡潔一點。 – Roman