Database 在数据库中连接多个表

Database 在数据库中连接多个表,database,haskell,yesod,Database,Haskell,Yesod,假设我有以下型号: User ident Text password Text Maybe UniqueUser ident deriving Typeable Payment timestamp UTCTime from UserId to UserId receiptId ReceiptId ReceiptUser userId UserId receiptId Rece

假设我有以下型号:

User
    ident Text
    password Text Maybe
    UniqueUser ident
    deriving Typeable
Payment
    timestamp UTCTime
    from UserId
    to UserId
    receiptId ReceiptId
ReceiptUser                     
    userId UserId
    receiptId ReceiptId
Receipt
    owner UserId
    money Int
我想执行如下查询:

SELECT ReceiptUser.UserId, Receipt.ReceiptOwner, Receipt.Id, Receipt.Price
FROM ReceiptUser, Receipt, Payment
WHERE ReceiptUser.ReceiptId == Receipt.Id
      AND NOT (Payment.ReceiptId == Receipt.Id AND Payment.From == ReceiptUser.UserId AND Payment.To == Receipt.Owner)
它应该查找尚未向其他用户付款的所有用户,以及相应的收据信息


我怎样才能用Yes来表达呢?在我看来,persistent只为一个表上的简单查询提供了一个接口。

persistent的接口非常简单,通常不足以实现甚至稍微复杂的SQL。是一个位于Persistent数据库机器之上的库,它为您提供了一个更像Haskell DSL的SQL,可以让您表达所需内容。

Persistent的界面非常简单,通常不足以实现哪怕是稍微复杂的SQL。是在Persistent数据库机器上的一个库构建,它提供了一个更像Haskell DSL的SQL,可以让您表达您所寻找的内容。

由于您正在执行与我相同的任务,我想让您指向启动框架根目录中的manytomy.hs文件。
它包含两个关键函数:joinTables和joinTables3,它们将基于给定的键连接表。getPaymentsR下的/Handler/Payment.hs中给出了使用后者的示例。使用该功能,您应该能够进行连接,以便结果为[(实体接收方用户、实体接收方、实体支付)]

由于您所做的作业与我所做的作业相同,因此我想向您指出起始框架根目录中的ManyToMany.hs文件。
它包含两个关键函数:joinTables和joinTables3,它们将基于给定的键连接表。getPaymentsR下的/Handler/Payment.hs中给出了使用后者的示例。使用该功能,您应该能够进行连接,以便结果为[(实体接收方用户、实体接收方、实体支付)]

我很乐意使用埃斯奎莱托。然而,在我当前的作业中,我必须只使用YesSOD。我看到YesSOD提供了一种使用原始SQL的方法。你会推荐使用它吗?这是可能的,尽管我从未使用过Persistent的原始SQL功能,所以我个人不能推荐它。我会尝试一下。谢谢。我很乐意用埃斯奎莱托。然而,在我当前的作业中,我必须只使用YesSOD。我看到YesSOD提供了一种使用原始SQL的方法。你会推荐使用它吗?这是可能的,尽管我从未使用过Persistent的原始SQL功能,所以我个人不能推荐它。我会尝试一下。谢谢,是的,谢谢。我知道了这些是如何工作的,所以我现在差不多完成了作业。是的,谢谢。我知道了这些是如何工作的,所以我现在差不多完成了作业。