簡體   English   中英

mysql查詢對一些結果進行排序,但可能沒有連接數據

[英]mysql query to sort some results but join data may or not be present

SELECT PLD_LINK.ID, PLD_LINK.TITLE, PLD_LINK.URL, PLD_CATEGORY.TITLE, TLL_SORT_STATUS.status, PLD_LINK_COMMENT.DATE_ADDED
    FROM PLD_LINK, PLD_CATEGORY, TLL_SORT_STATUS, PLD_LINK_COMMENT 
    WHERE PLD_LINK.CATEGORY_ID = PLD_CATEGORY.ID 
        AND PLD_LINK.ID = TLL_SORT_STATUS.link_id 
        AND PLD_LINK.PAGERANK BETWEEN -1 AND 2
        AND PLD_LINK.CATEGORY_ID IN (1291,2113,2664)
        ORDER BY COUNT(PLD_LINK.ID = PLD_LINK_COMMENT.LINK_ID) ASC

這是我的查詢。 我想獲得所有在ORDER BY之前匹配的結果。 現在,來自PLD_LINK.ID的某些ID可能在表PLD_LINK_COMMENT中,但有些可能不在。 因此,當mysql達到ORDER BY時,我想根據以下條件按升序對結果進行排序:不在PLD_LINK_COMMENT中的ID應該是第一個,然后是基於每個ID的評論數的ID。 。 (ID不能有1、2 ...條注釋。)

您需要在三個主表和PLD_LINK_COMMENT之間進行外部聯接。

外部聯接意味着PLD_LINK_COMMENT.LINK_ID為空,這意味着COUNT將為PLD_LINK.ID返回0,且沒有匹配的鏈接注釋,而其他注釋的數目則適當。

您需要按未聚合的列進行分組……但是這表明M.Date_Added可能不是您要分組的; 並且評論中的問題/答案表明我們需要最新的評論日期,或者一些荒謬的早期數據,例如“ 0001-01-01”(SQL中最早的有效日期)或“ 0000-00-00”(偽-MySQL使用的日期)。

因此:

SELECT K.ID, K.Title, K.URL, C.Title, S.Status,
       MAX(NVL(M.Date_Added, DATE '0001-01-01')) AS MostRecentComment
  FROM Pld_Link AS K JOIN Pld_Category AS C ON K.Category_ID = C.ID
       JOIN Tll_Sort_Status AS C ON K.ID = S.Link_ID
       OUTER JOIN Pld_Link_Comment AS M ON K.ID = M.Link_ID
 WHERE K.PageRank BETWEEN -1 AND 2
   AND K.Category_ID IN (1291,2113,2664)
 GROUP BY K.ID, K.Title, K.URL, C.Title, S.Status
 ORDER BY COUNT(M.Link_ID) ASC

您還需要DBMS(您所說的MySQL)來允許您按SELECT列表中未列出的列進行排序。


經過測試的SQL

在MacOS X 10.6.2上使用IBM Informix Dynamic Server 11.50進行了測試。 我使用DATE('0001-01-01')是因為IDS具有一個稱為DATE的函數,該函數需要括號,而我使用了“ 0001-01-01”是因為IDS無法將'0000-00-00'識別為有效日期。

SELECT K.ID, K.Title, K.URL, C.Title, S.STATUS,
       MAX(NVL(M.Date_Added, DATE('0001-01-01'))) AS MostRecentComment,
  FROM PLD_Link AS K JOIN PLD_Category AS C ON K.Category_ID = C.ID
       JOIN Tll_Sort_Status AS S ON K.ID = S.Link_ID
       LEFT OUTER JOIN PLD_Link_Comment AS M ON K.ID = M.Link_ID
 WHERE K.PageRank BETWEEN -1 AND 2
   AND K.Category_ID IN (1291,2113,2664)
 GROUP BY K.ID, K.Title, K.URL, C.Title, S.STATUS
 ORDER BY COUNT(M.Link_ID)

結果:

id  title                 url                       title   status  mostrecent
4   #4: This should show  example.com/?id=4;c=2113  Cat 2113  0  0001-01-01
3   #3: This should show  example.com/?id=3;c=1291  Cat 1291 -1  2010-03-10
7   #7: This should show  example.com/?id=7;c=2664  Cat 2664  3  2010-07-11
5   #5: This should show  example.com/?id=5;c=2113  Cat 2113  1  2010-05-17
2   #2: This should show  example.com/?id=2;c=1291  Cat 1291 -2  2010-02-13

或者,選擇評論計數,以顯示數據以正確的順序顯示。

SELECT K.ID, K.Title, K.URL, C.Title, S.STATUS,
       MAX(NVL(M.Date_Added, DATE('0001-01-01'))) AS MostRecentComment,
       COUNT(M.Link_ID) AS CommentCount
  FROM PLD_Link AS K JOIN PLD_Category AS C ON K.Category_ID = C.ID
       JOIN Tll_Sort_Status AS S ON K.ID = S.Link_ID
       LEFT OUTER JOIN PLD_Link_Comment AS M ON K.ID = M.Link_ID
 WHERE K.PageRank BETWEEN -1 AND 2
   AND K.Category_ID IN (1291,2113,2664)
 GROUP BY K.ID, K.Title, K.URL, C.Title, S.STATUS
 ORDER BY CommentCount ASC;

結果集:

id title                 url                       title  status  recent  count
4  #4: This should show  example.com/?id=4;c=2113  Cat 2113  0  0001-01-01  0
3  #3: This should show  example.com/?id=3;c=1291  Cat 1291 -1  2010-03-10  1
7  #7: This should show  example.com/?id=7;c=2664  Cat 2664  3  2010-07-11  1
5  #5: This should show  example.com/?id=5;c=2113  Cat 2113  1  2010-05-17  2
2  #2: This should show  example.com/?id=2;c=1291  Cat 1291 -2  2010-02-13  3

樣本數據庫

PLD_類別

CREATE TABLE PLD_Category
(
    ID      SERIAL NOT NULL PRIMARY KEY,
    Title   VARCHAR(32) NOT NULL
);

INSERT INTO PLD_Category VALUES(3961, 'Cat 3961');
INSERT INTO PLD_Category VALUES(1291, 'Cat 1291');
INSERT INTO PLD_Category VALUES(2113, 'Cat 2113');
INSERT INTO PLD_Category VALUES(2664, 'Cat 2664');

PLD_Link

CREATE TABLE PLD_Link
(
    ID          SERIAL NOT NULL PRIMARY KEY,
    Category_ID INTEGER NOT NULL REFERENCES PLD_Category,
    Title       VARCHAR(32) NOT NULL,
    PageRank    INTEGER NOT NULL,
    URL         VARCHAR(64) NOT NULL
);

INSERT INTO PLD_Link
    VALUES(1, 3961, '#1: This should not',  0, 'example.com/?id=1;c=3961');
INSERT INTO PLD_Link
    VALUES(2, 1291, '#2: This should show', 0, 'example.com/?id=2;c=1291');
INSERT INTO PLD_Link
    VALUES(3, 1291, '#3: This should show', 0, 'example.com/?id=3;c=1291');
INSERT INTO PLD_Link
    VALUES(4, 2113, '#4: This should show', 0, 'example.com/?id=4;c=2113');
INSERT INTO PLD_Link
    VALUES(5, 2113, '#5: This should show', 0, 'example.com/?id=5;c=2113');
INSERT INTO PLD_Link
    VALUES(6, 3961, '#6: This should not',  0, 'example.com/?id=6;c=3961');
INSERT INTO PLD_Link
    VALUES(7, 2664, '#7: This should show', 0, 'example.com/?id=7;c=2664');
INSERT INTO PLD_Link
    VALUES(8, 2664, '#8: This should show', 0, 'example.com/?id=8;c=2664');

TLL_Sort_Status

CREATE TABLE TLL_Sort_Status
(
    STATUS      INTEGER NOT NULL,
    Link_ID     INTEGER NOT NULL REFERENCES PLD_Link
);

INSERT INTO TLL_Sort_Status VALUES(-3, 1);
INSERT INTO TLL_Sort_Status VALUES(-2, 2);
INSERT INTO TLL_Sort_Status VALUES(-1, 3);
INSERT INTO TLL_Sort_Status VALUES( 0, 4);
INSERT INTO TLL_Sort_Status VALUES(+1, 5);
INSERT INTO TLL_Sort_Status VALUES(+2, 6);
INSERT INTO TLL_Sort_Status VALUES(+3, 7);
INSERT INTO TLL_Sort_Status VALUES(+4, 1);

PLD_Link_Comment

CREATE TABLE PLD_Link_Comment
(
    Link_ID     INTEGER NOT NULL REFERENCES PLD_Link,
    Date_Added  DATE NOT NULL,
    COMMENT     VARCHAR(64) NOT NULL
);

INSERT INTO PLD_Link_Comment VALUES(1, DATE('2010-01-11'), 'Vacuous comment');
INSERT INTO PLD_Link_Comment VALUES(2, DATE('2010-02-11'), 'Vacuous comment');
INSERT INTO PLD_Link_Comment VALUES(2, DATE('2010-02-12'), 'Vacuous comment');
INSERT INTO PLD_Link_Comment VALUES(2, DATE('2010-02-13'), 'Vacuous comment');
INSERT INTO PLD_Link_Comment VALUES(3, DATE('2010-03-10'), 'Vacuous comment');
INSERT INTO PLD_Link_Comment VALUES(5, DATE('2010-05-15'), 'Vacuous comment');
INSERT INTO PLD_Link_Comment VALUES(5, DATE('2010-05-17'), 'Vacuous comment');
INSERT INTO PLD_Link_Comment VALUES(6, DATE('2010-06-10'), 'Vacuous comment');
INSERT INTO PLD_Link_Comment VALUES(6, DATE('2010-06-12'), 'Vacuous comment');
INSERT INTO PLD_Link_Comment VALUES(6, DATE('2010-06-14'), 'Vacuous comment');
INSERT INTO PLD_Link_Comment VALUES(6, DATE('2010-06-19'), 'Vacuous comment');
INSERT INTO PLD_Link_Comment VALUES(7, DATE('2010-07-11'), 'Vacuous comment');
INSERT INTO PLD_Link_Comment VALUES(8, DATE('2010-08-12'), 'Vacuous comment');
INSERT INTO PLD_Link_Comment VALUES(8, DATE('2010-08-13'), 'Vacuous comment');

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM