【问题标题】:MySQL SELECTs how to joinMySQL SELECTs 如何加入
【发布时间】:2021-05-17 11:43:20
【问题描述】:

我在 MySQL 数据库中有这些表:

CREATE TABLE Restaurante(
    nombreRest VARCHAR(30) NOT NULL, 
    telefono INT(9) NOT NULL, 
    domicilio VARCHAR(50) NOT NULL,
    nTenedores ENUM('1','2','3','4','5') NOT NULL,
    tipoCocina VARCHAR(15) NOT NULL,
    nombreCiudad VARCHAR(30) NOT NULL,
    idRestaurante SMALLINT NOT NULL,
    PRIMARY KEY (idRestaurante),
    FOREIGN KEY (tipoCocina) REFERENCES tipoCocina(tipoCocina),
    FOREIGN KEY (nombreCiudad) REFERENCES Ciudad(nombreCiudad)
)

CREATE TABLE Servicio(
    idServicio SMALLINT NOT NULL, 
    precioT DOUBLE(2,2) NOT NULL, 
    franjaServicio VARCHAR(10) NOT NULL,
    cafe BOOLEAN,
    beINbida BOOLEAN,
    fecha DATE NOT NULL,
    idRestaurante SMALLINT NOT NULL,
    PRIMARY KEY (idServicio),
    FOREIGN KEY (idRestaurante) REFERENCES Restaurante(idRestaurante)
)

CREATE TABLE Plato(
    nombrePlato VARCHAR(30) NOT NULL,
    descripción VARCHAR(150) NOT NULL,
    idRestaurante SMALLINT NOT NULL,
    PRIMARY KEY (nombrePlato),
    FOREIGN KEY (idRestaurante) REFERENCES Restaurante(idRestaurante)
)

CREATE TABLE Menu(
    idServicio SMALLINT NOT NULL, 
    PrimerPlato VARCHAR(30) NOT NULL,
    SegundoPlato VARCHAR(30) NOT NULL,
    Postre VARCHAR(30) NOT NULL,
    FOREIGN KEY (idServicio) REFERENCES Servicio(idServicio),
    FOREIGN KEY (PrimerPlato) REFERENCES Plato(nombrePlato),
    FOREIGN KEY (SegundoPlato) REFERENCES Plato(nombrePlato),
    FOREIGN KEY (Postre) REFERENCES Plato(nombrePlato),
    PRIMARY KEY (idServicio)

)

(不知道好不好,刚上DB的第一门课,如有任何建议,将不胜感激)

我需要显示一家餐厅的 nombreRest、telefono、domicilio 的列表,他们的菜单包含这三个柏拉图('Arros Brut'、'Porcella'、'Pijama')。

我做了三个不同的选择,我的想法是想办法以某种方式加入他们,但我不知道那会如何工作。

SELECT idServicio
FROM Menu
WHERE PrimerPlato = 'Arros Brut' AND SegundoPlato = 'Porcella' AND Postre = 'Pijama'

SELECT idRestaurante 
FROM Servicio
WHERE Servicio.idRestaurante = idServicio

SELECT (nombreRest, telefono, domicilio)
FROM Restaurante
WHERE Restaurante.idRestaurante = idRestaurante

【问题讨论】:

  • 发布 DDL 做得很好,谢谢!现在通过edit提出问题并以INSERT 语句的形式提供示例数据以及将该示例数据作为表格文本提供所需的结果来完成它。

标签: mysql select


【解决方案1】:

您应该使用标记为外键的属性来连接另一个表。这个外键对应另一个表的主键。

例如:

SELECT r.nombreRest, r.telefono, r.domicilio
FROM Restaurante r 
JOIN Servicio s
    ON r.idRestaurante = s.idRestaurante
JOIN Menu m
    ON m.idServicio = s.idServicio
WHERE m.PrimerPlato = 'Arros Brut'
    AND m.SegundoPlato = 'Porcella'
    AND m.Postre = 'Pijama';

如果我是正确的,您还应该将 Plato 表加入到查询中。我没有看到您在示例中这样做,所以希望这可行。

website 解释了更多关于您可以进行的不同联接的信息

【讨论】:

  • 您好,非常感谢您的回答,您添加柏拉图是什么意思,它是如何工作的?
  • 如果我理解您的表是正确的,柏拉图表包含独特的菜肴。通常,您将主键放在数字类型上,例如 number 或 (small)int 而不是 (var)char。如果你想调整它,你可以像下面这样改变它。然后,我将向 Plato 表添加一个 'idPlato' SMALLINT 并将其作为主键,并将 UNIQUE 约束添加到 nombrePlato。然后将 Menu.PrimerPlato、Menu.SegundoPlato 和 Menu.Postre 更改为 SMALLINT 而不是 VARCHAR。
  • 您的选择语句将如下所示: SELECT r.nombreRest, r.telefono, r.domicilio FROM Restaurante r JOIN Servicio s ON r.idRestaurante = s.idRestaurante JOIN Menu m ON m.idServicio = s.idServicio WHERE m.PrimerPlato = (SELECT idPlato FROM Plato WHERE nombrePlato = 'Arros Brut') AND m.SegundoPlato = (SELECT idPlato from Plato WHERE nombrePlato = 'Porcella') AND m.Postre = (SELECT idPlato FROM Plato WHERE nombrePlato = Pijama');
猜你喜欢
  • 1970-01-01
  • 2017-09-07
  • 1970-01-01
  • 2010-11-17
  • 2020-12-27
  • 2011-02-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多