1

ここと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 だけです。この場合は、idMedicamento=5 の MEDICAMENTO です。

私が間違っていることは何ですか?本当に解りません。

ありがとう

4

2 に答える 2

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
于 2013-06-02T09:22:46.317 に答える
0

最初のクエリが間違っているため、2 番目のクエリも間違っています。私はそれが有効な SQL だとは思いませんし、なぜそれがうまくいっているのかわかりません。

最初のクエリの内側のクエリ (Q1 と呼びます) は問題ありません: 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 が含まれているため、多くの繰り返しがあります。

于 2013-06-02T06:20:49.610 に答える