Mysql 具有多个联接的表的光滑普通SQL隐式GetResult

Mysql 具有多个联接的表的光滑普通SQL隐式GetResult,mysql,scala,slick,Mysql,Scala,Slick,我使用的是光滑的普通SQL,我有一个类似以下内容的表模式: CREATE TABLE users ( id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, name VARCHAR(191) NOT NULL ); CREATE TABLE images ( id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, url VARCHAR(191) NOT NULL, user_id INT NOT NULL,

我使用的是光滑的普通SQL,我有一个类似以下内容的表模式:

CREATE TABLE users (
  id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
  name VARCHAR(191) NOT NULL
);

CREATE TABLE images (
  id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
  url VARCHAR(191) NOT NULL,
  user_id INT NOT NULL,
  FOREIGN KEY (user_id) REFERENCES users(id)
  ON DELETE CASCADE ON UPDATE CASCADE
);
case class User(name: String, imageUrls: Array[String])
val u = Q.query[String, User]("""
  SELECT
    users.name, images.url
  FROM
    users
    INNER JOIN images ON images.user_id = users.id
  WHERE
    users.name = ?
""").first(name)
还有一个case类,如下所示:

CREATE TABLE users (
  id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
  name VARCHAR(191) NOT NULL
);

CREATE TABLE images (
  id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
  url VARCHAR(191) NOT NULL,
  user_id INT NOT NULL,
  FOREIGN KEY (user_id) REFERENCES users(id)
  ON DELETE CASCADE ON UPDATE CASCADE
);
case class User(name: String, imageUrls: Array[String])
val u = Q.query[String, User]("""
  SELECT
    users.name, images.url
  FROM
    users
    INNER JOIN images ON images.user_id = users.id
  WHERE
    users.name = ?
""").first(name)
是否可以编写查询和隐式
GetResult
,以便执行以下操作:

CREATE TABLE users (
  id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
  name VARCHAR(191) NOT NULL
);

CREATE TABLE images (
  id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
  url VARCHAR(191) NOT NULL,
  user_id INT NOT NULL,
  FOREIGN KEY (user_id) REFERENCES users(id)
  ON DELETE CASCADE ON UPDATE CASCADE
);
case class User(name: String, imageUrls: Array[String])
val u = Q.query[String, User]("""
  SELECT
    users.name, images.url
  FROM
    users
    INNER JOIN images ON images.user_id = users.id
  WHERE
    users.name = ?
""").first(name)

一对多的关系是一件棘手的事情。不确定是否有任何现成的方法允许
GetResult
将记录向下折叠,以便图像URL按用户id聚合到单个
用户
记录上。但您可以通过对示例进行一些调整来自行处理:

case class User(name: String, imageUrls: List[String])

val records = Q.query[String, (String,String)]("""
  SELECT
    users.name, images.url
  FROM
    users
    INNER JOIN images ON images.user_id = users.id
  WHERE
    users.name = ?
""").list(name)  

val users = records.groupBy(_._1).map(tup => User(tup._1, tup._2.map(_._2)))

完成后,您将有一个
Iterable[User]
作为
users
val.

这里的一对多关系很棘手。不确定是否有任何现成的方法允许
GetResult
将记录向下折叠,以便图像URL按用户id聚合到单个
用户
记录上。但您可以通过对示例进行一些调整来自行处理:

case class User(name: String, imageUrls: List[String])

val records = Q.query[String, (String,String)]("""
  SELECT
    users.name, images.url
  FROM
    users
    INNER JOIN images ON images.user_id = users.id
  WHERE
    users.name = ?
""").list(name)  

val users = records.groupBy(_._1).map(tup => User(tup._1, tup._2.map(_._2)))
完成后,您将有一个
Iterable[User]
作为
users
val