2016-01-14 2 views
0

Я пытаюсь к следующему SQL-запроса с Slick 3.0Два соединяется с одним столом с Slick 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); 

Я новичок в Slick и я никогда не был супер Трещина в MySQL, так что я нужна помощь здесь. Как вы можете видеть, я делаю два соединения из таблицы бесед в одну таблицу talk_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 в другом db-запросе и так далее. Фактически я сделал это, когда я сопоставил Conversation с его идентификатором (query.map(_.conversationId)).

Слайк немного сложно понять в начале, особенно когда вы привыкли к 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

Смежные вопросы