我遇到了一个问题,即使在这里和sqlite.org上进行研究后我也无法解决这个问题
所以,我有这些表:
CREATE TABLE MEDICO(
idMedico INTEGER PRIMARY KEY AUTOINCREMENT,
nome VARCHAR(50) NOT NULL,
morada VARCHAR(50) NOT NULL,
telefone VARCHAR(9) NOT NULL
);
CREATE TABLE PRESCRICAO(
idPrescricao INTEGER PRIMARY KEY AUTOINCREMENT,
idConsulta INTEGER,
idMedico INTEGER NOT NULL,
nrOperacional INTEGER NOT NULL,
FOREIGN KEY(idConsulta) REFERENCES CONSULTA(idConsulta),
FOREIGN KEY(idMedico) REFERENCES MEDICO(idMedico),
FOREIGN KEY(nrOperacional) REFERENCES UTENTE(nrOperacional)
);
CREATE TABLE PRESCRICAO_MEDICAMENTO(
idPrescricao INTEGER ,
idMedicamento INTEGER,
nrEmbalagens INTEGER NOT NULL,
FOREIGN KEY(idPrescricao) REFERENCES PRESCRICAO(idPrescricao),
FOREIGN KEY(idMedicamento) REFERENCES MEDICAMENTO(idMedicamento),
PRIMARY key(idPrescricao, idMedicamento)
);
我想要使用MEDICO最常用的idMedicamento来说idMedico = 7, 直到这里,一切都很好,我正在做:
SELECT idmedicamento, MAX(total) as maximum
FROM (SELECT idMedicamento, COUNT(idMedicamento) AS total
FROM PRESCRICAO_MEDICAMENTO
WHERE PRESCRICAO_MEDICAMENTO.idPrescricao IN (
SELECT idPrescricao FROM PRESCRICAO
WHERE PRESCRICAO.idmedico= 7
)
GROUP BY idMedicamento);
我得到:
IDmedicamento:3 最大:5
这是我想要的东西,它是正确的。
但是当我这样做时:
SELECT idMedicamento
FROM (SELECT idMedicamento, MAX(total) as maximum
FROM (SELECT idMedicamento, COUNT(idMedicamento) AS total
FROM PRESCRICAO_MEDICAMENTO
WHERE PRESCRICAO_MEDICAMENTO.idPrescricao IN (
SELECT idPrescricao FROM PRESCRICAO
WHERE PRESCRICAO.idmedico= 7
)
GROUP BY idMedicamento));
我得到的是MEDICO最后一次使用的idMedicamento,在这种情况下,MEDICAMENTO的idMedicamento = 5。
知道我做错了什么吗?真的想不出来。
由于
答案 0 :(得分:1)
在许多情况下,使用最大值从记录中获取其他列的最简单方法是使用ORDER BY
/ LIMIT 1
:
SELECT idMedicamento
FROM PRESCRICAO_MEDICAMENTO
WHERE idPrescricao IN (SELECT idPrescricao
FROM PRESCRICAO
WHERE idmedico = 7)
GROUP BY idMedicamento
ORDER BY COUNT(*) DESC
LIMIT 1
答案 1 :(得分:0)
第二个查询错误,因为第一个查询错误;我不认为它是有效的SQL,我不确定它为什么适合你。
第一个查询的内部查询(我称之为Q1)是ok:SELECT id,COUNT(id)AS total FROM ... GROUP BY id;
但是第一个查询的外部查询被破坏了:SELECT id,MAX(total)FROM ...;没有GROUP BY。这是错误的,因为MAX强制对整个表进行聚合(这是你想要的),但是'id'没有聚合。
如果从查询中删除“id”,则应正确获取最大值:SELECT MAX(total)AS maximum FROM ...;我称之为Q2。
然后它变得丑陋,因为SQLite不支持CTE。基本上是:
SELECT id FROM (Q1) WHERE total = (Q2);
但是你必须写出Q1和Q2,并且有很多重复,因为Q2包括Q1。