Многопользовательский SQL-запрос сокращен до одного результата - PullRequest
0 голосов
/ 25 августа 2009

Есть информация, которая нужна моему веб-приложению из моей базы данных, которую я могу сгенерировать только для всей базы данных со множеством запросов, заполняющих совершенно новую таблицу. Может кто-нибудь предложить мне один запрос, который возвращает результаты, точно такие же, как эта заполненная таблица?

Во-первых, вот две таблицы, в которых есть информация.

CREATE OR REPLACE TABLE AS_Event(
    AS_Id   INT,
    geneAbsentId    VARCHAR(15),
    genePresentId   VARCHAR(15),
)ENGINE=INNODB;

CREATE OR REPLACE TABLE AS_ChoiceSupport(
    AS_Id   INT,
    GeneId  VARCHAR(15),
    ESTId   VARCHAR(20),
    LibraryId   INT,
)ENGINE=INNODB;

Я упростил это до информации, которая нам нужна. geneAbsentId и genePresentId (или AS_Choice) указывают на ту же таблицу, что и GeneId в AS_ChoiceSupport. Каждый AS_Choice в каждом событии может иметь> = 0 строку AS_ChoiceSupport.

Теперь, вот новая таблица, которую я создаю, но мне нужно, чтобы она была одним запросом.

CREATE TABLE AS_Support_Count(
    AS_Id   INT,
    gaCount INT,
    gpCount  INT,
    PRIMARY KEY(AS_Id),
    FOREIGN KEY(AS_Id) REFERENCES AS_Event(AS_Id) ON UPDATE CASCADE ON DELETE CASCADE
)ENGINE=INNODB;

INSERT INTO AS_Support_Count(AS_Id) SELECT AS_Id FROM AS_Event

CREATE OR REPLACE VIEW TEMP AS SELECT e.AS_Id, COUNT(e.genePresentId) AS gpCount FROM AS_Event e, AS_ChoiceSupport c WHERE (e.AS_Id = c.AS_Id) AND e.genePresentId = c.GeneId GROUP BY e.AS_Id

UPDATE AS_Support_Count a, TEMP t
SET a.gpCount = t.gpCount
WHERE a.AS_Id = t.AS_Id

UPDATE AS_Support_Count
SET gpCount = 0
WHERE gpCount IS NULL

CREATE OR REPLACE VIEW TEMP AS SELECT e.AS_Id, COUNT(e.geneAbsentId) AS gaCount FROM AS_Event e, AS_ChoiceSupport c WHERE (e.AS_Id = c.AS_Id) AND e.geneAbsentId = c.GeneId GROUP BY e.AS_Id

UPDATE AS_Support_Count a, TEMP t
SET a.gaCount = t.gaCount
WHERE a.AS_Id = t.AS_Id

UPDATE AS_Support_Count
SET gaCount = 0
WHERE gaCount IS NULL

Причина, по которой мне нужно это сжатие для одного запроса, заключается в том, что мне иногда нужно получать информацию для событий на основе идентификатора библиотеки. т.е. для AS_Event x мне нужно знать, сколько существует AS_ChoiceSupports из LibraryId y.

Я знаю, что это огромная проблема, поэтому я переведу $ 5 на PokerStars тому, кто даст мне правильный ответ.

Ответы [ 2 ]

1 голос
/ 25 августа 2009

Я узнал, как транспонировать данные из онлайн-учебника текст ссылки

И вот запрос, который я придумал

SELECT
    COUNT(CASE WHEN e.genePresentId = c.GeneId THEN c.LibraryId ELSE NULL END) AS 'gpCount',
    COUNT(CASE WHEN e.geneAbsentId = c.GeneId THEN c.LibraryId ELSE NULL END) AS 'gaCount'
FROM
    AS_Event e, AS_ChoiceSupport c
WHERE e.AS_Id = c.AS_Id AND c.LibraryId = ? <sql:param value="${LibraryId}"/>
GROUP BY
    c.AS_Id
ORDER BY
    e.AS_Id

Скидки на премию PokerStars. Однако, если у вас есть лучший ответ, предоставьте его сообществу.

0 голосов
/ 25 августа 2009

дает ли это те же результаты, что и select * from AS_Support_Count?

SELECT e.AS_Id
     , COUNT(e.geneAbsentId) as gaGount
     , COUNT(e.GenePresentId) as gpCount
  FROM AS_Event e
  JOIN AS_ChoiceSupport c
    ON c.AS_Id = e.AS_Id
   AND c.GeneId IN (e.geneAbesntId, e.genePresentId)
GROUP
    BY e.AS_Id
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...