簡體   English   中英

如何在另一行之前選擇一行 - 從兩個表 SQL?

[英]How to select one row before another one - from a two tables SQL?

查詢:

SELECT DISTINCT UNIQUEID,ID
FROM
(
  (SELECT UNIQUEID, DATE, ID
     FROM stackscontents
    WHERE BACKGROUND IS NOT NULL 
      AND TITLE IS NOT NULL 
      AND ID < ?
    ORDER BY DATE DESC limit 1)
   UNION ALL
   (SELECT UNIQUEID, DATE, ID
      FROM stackscontents 
      WHERE BACKGROUND IS NOT NULL
        AND TITLE IS NOT NULL
        AND ID > ?
      ORDER BY DATE ASC limit 1)
)
UNION ALL (
  (SELECT UNIQUEID, DATE, ID
     FROM sharedlinks 
    WHERE ID < ?
    ORDER BY DATE DESC limit 1)
  UNION ALL
  (SELECT UNIQUEID, DATE, ID
     FROM sharedlinks
    WHERE ID > ? 
    ORDER BY DATE ASC limit 1)
) t

准確地說,我試圖在 2 個表中的另一行之前獲取一行。 但我收到如下語法錯誤:

com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException:每個派生表都必須有自己的別名

下面是我使用查詢的代碼:

if (NewDetails == null) {

        query2 = "SELECT DISTINCT UNIQUEID,ID FROM ((SELECT UNIQUEID, DATE, ID FROM stackscontents WHERE BACKGROUND IS NOT NULL AND TITLE IS NOT NULL AND ID < ? ORDER BY DATE DESC limit 1) UNION ALL (SELECT UNIQUEID, DATE, ID FROM stackscontents WHERE BACKGROUND IS NOT NULL AND TITLE IS NOT NULL ID > ? ORDER BY DATE ASC limit 1)) UNION ALL "
        + "((SELECT UNIQUEID, DATE, ID FROM sharedlinks WHERE ID < ? ORDER BY DATE DESC limit 1) UNION ALL (SELECT UNIQUEID, DATE, ID FROM sharedlinks WHERE ID > ? ORDER BY DATE ASC limit 1)) t ";

    try {
        DBConnect Database = new DBConnect();
        Connection con = null;
        PreparedStatement ps = null;
        ResultSet rs = null;

        try {
            con = Database.getcon();
            ps = con.prepareStatement(query2);
            ps.setInt(1, minID);
            ps.setInt(2, minID);
            ps.setInt(3, minID);
            ps.setInt(4, minID);
            rs=ps.executeQuery();

            while(rs.next()) {
                minID = rs.getInt(2);
                parts[i] = rs.getString(1);
                i--;
            }
        } finally {
            if (ps != null)
                ps.close();
            if (rs != null)
                rs.close();
            if (con != null)
                con.close();
        }
    } catch (SQLException e) {
        e.printStackTrace();
    }                       
}

不幸的是,它也沒有返回預期的行 - 1,但它從第一行的 stackscontents 返回 451。 如下:

堆棧內容:

堆棧內容表行

共享鏈接:

共享鏈接表行

你的括號把事情搞砸了。 這是您重新格式化的代碼以顯示原因:

 SELECT DISTINCT UNIQUEID,ID
 FROM (
        (SELECT UNIQUEID, DATE, ID FROM stackscontents WHERE BACKGROUND IS NOT NULL AND TITLE IS NOT NULL AND ID < ? ORDER BY DATE DESC limit 1)
       UNION ALL
        (SELECT UNIQUEID, DATE, ID FROM stackscontents WHERE BACKGROUND IS NOT NULL AND TITLE IS NOT NULL AND ID > ? ORDER BY DATE ASC limit 1)
      )
UNION ALL
      (
        (SELECT UNIQUEID, DATE, ID FROM sharedlinks WHERE ID < ? ORDER BY DATE DESC limit 1)
       UNION ALL
        (SELECT UNIQUEID, DATE, ID FROM sharedlinks WHERE ID > ? ORDER BY DATE ASC limit 1)
      ) t

難怪 SQL 解析器會“嗯?”

你的代碼應該是:

 SELECT DISTINCT UNIQUEID,ID
 FROM (
        (SELECT UNIQUEID, DATE, ID FROM stackscontents WHERE BACKGROUND IS NOT NULL AND TITLE IS NOT NULL AND ID < ? ORDER BY DATE DESC limit 1)
       UNION ALL
        (SELECT UNIQUEID, DATE, ID FROM stackscontents WHERE BACKGROUND IS NOT NULL AND TITLE IS NOT NULL AND ID > ? ORDER BY DATE ASC limit 1)
       UNION ALL
        (SELECT UNIQUEID, DATE, ID FROM sharedlinks WHERE ID < ? ORDER BY DATE DESC limit 1)
       UNION ALL
        (SELECT UNIQUEID, DATE, ID FROM sharedlinks WHERE ID > ? ORDER BY DATE ASC limit 1)
     ) t

暫無
暫無

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

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