首页 > 解决方案 > ajuda com SELECT,帮我选择 mysql

问题描述

表Usuarios

usuario_id | name
    20     | Jose
    22     | Maria

表Pacientes

paciente_id | usuario_id
    10      |    20

表功能

funcionario_id | usuario_id | CRM
      3        |    22      | 342-BA

Table Consultas_medicas

id | paciente_id | funcionario_id | date  |  time
 1 |      10     |        3       | 11/11 |  13:30

我需要在 Consultas_medicas 表中执行 Select 并给我 paciente_id 的名称和 funcionario_id 的名称

我试过这个:

SELECT * FROM 
    usuarios as u 
INNER JOIN 
   funcionarios as f 
INNER JOIN 
   consultas_medicas as c 
INNER JOIN 
   pacientes as c 
ON 
   (u.id=f.usuario_id) 
and 
   (c.funcionario_id=f.funcionario_id)

标签: mysql

解决方案


以您在上面写的内容,我将假设这是您的基本架构:

CREATE TABLE usuarios
(
    usuario_id INT NOT NULL,
    name VARCHAR(255),
    PRIMARY KEY (usuario_id)
);

CREATE TABLE pacientes 
(
    paciente_id INT NOT NULL,
    usuario_id INT NOT NULL,
    PRIMARY KEY (paciente_id, usuario_id)
);

CREATE TABLE funcionarios 
(
    funcionario_id INT NOT NULL,
    usuario_id INT NOT NULL,
    CRM VARCHAR(255),
    PRIMARY KEY (funcionario_id)
);

CREATE TABLE consultas_medicas
(
    id INT NOT NULL,
    paciente_id INT NOT NULL,
    funcionario_id INT NOT NULL,
    date VARCHAR(255),
    time VARCHAR(255),
    PRIMARY KEY (id)
);

ALTER TABLE pacientes ADD CONSTRAINT FOREIGN KEY (usuario_id) REFERENCES usuarios(usuario_id);
ALTER TABLE funcionarios ADD CONSTRAINT FOREIGN KEY (usuario_id) REFERENCES usuarios(usuario_id);
ALTER TABLE consultas_medicas ADD CONSTRAINT FOREIGN KEY (paciente_id) REFERENCES pacientes(paciente_id);
ALTER TABLE consultas_medicas ADD CONSTRAINT FOREIGN KEY (funcionario_id) REFERENCES funcionarios(funcionario_id);

INSERT INTO usuarios VALUES (20, 'Jose'), (22, 'Maria');
INSERT INTO pacientes VALUES (10, 20);
INSERT INTO funcionarios VALUES (3, 22, '342-BA');
INSERT INTO consultas_medicas VALUES (1, 10, 3, '11/11', '13:30');

如果是这样,您提供的查询使用c别名两次,并且usuarios表的主键是usuario_id而不仅仅是id.

如果是这样,那么这个查询应该可以工作:

SELECT * FROM 
    usuarios as u 
INNER JOIN 
   funcionarios as f 
INNER JOIN 
   consultas_medicas as c 
INNER JOIN 
   pacientes as p
ON 
   (u.usuario_id=f.usuario_id) 
and 
   (c.funcionario_id=f.funcionario_id)

该查询将导致几个重复的列名,特别usuario_id是将返回 3 次,因此您还需要为它们设置别名(或者您的代码需要知道如何处理它),但这应该可以让您了解正确的路径。

或者,如果你真的不需要加入usuarios表格,你可以稍微简化一下:

SELECT
    *
FROM
    pacientes p
LEFT JOIN
    consultas_medicas c
ON
    p.paciente_id = c.paciente_id
LEFT JOIN
    funcionarios f
ON
    c.funcionario_id = f.funcionario_id

推荐阅读