/ / MySQL पर एक विशिष्ट पंक्ति से पहले एक पंक्ति का चयन कैसे करें, यदि तालिका तिथि द्वारा आदेशित है? - mysql, sql, database

MySQL पर किसी विशिष्ट पंक्ति से पहले पंक्ति का चयन कैसे करें, यदि तालिका तिथि के अनुसार आदेशित है? - mysql, एसक्यूएल, डेटाबेस

मेरे पास इस तरह का चयन परिणाम है:

ID | DATE
----------------
10 | 2014-07-23
7  | 2014-07-24
8  | 2014-07-24
9  | 2014-07-24
1  | 2014-07-25
2  | 2014-07-25
6  | 2014-07-25
3  | 2014-07-26
4  | 2014-07-27
5  | 2014-07-28

उपरोक्त परिणाम तिथि द्वारा आदेशित है। अब, मैं पहले वाली एक पिछली पंक्ति का चयन करना चाहता हूं:

2  | 2014-07-25

जो है:

1  | 2014-07-25

यदि मुझे सटीक आईडी पता नहीं है, तो सशर्त कोड संगत होना चाहिए, यदि मैं पिछली पंक्ति का चयन करना चाहता हूं:

3  | 2014-07-26

जो है:

6  | 2014-07-25

मुझे किस शर्त का उपयोग करना चाहिए?

अद्यतन करें

कोशिश की:

SET @rank=0;
SELECT @rank:=@rank+1 AS rank, t1.*
FROM table t1

तब मुझे यह मिला:

RANK | ID | DATE
----------------
1    | 10 | 2014-07-23
2    | 7  | 2014-07-24
3    | 8  | 2014-07-24
4    | 9  | 2014-07-24
5    | 1  | 2014-07-25
6    | 2  | 2014-07-25
7    | 6  | 2014-07-25
8    | 3  | 2014-07-26
9    | 4  | 2014-07-27
10   | 5  | 2014-07-28

तब मैंने कोशिश की:

SET @rank=0;
SELECT @rank:=@rank+1 AS rank, t1.*
FROM table t1
WHERE rank < 3;

मुझे यह त्रुटि मिली: अज्ञात कॉलम "रैंक" "जहां क्लॉज" में।

उत्तर:

जवाब के लिए 2 № 1

यहाँ एक रास्ता है ...

 DROP TABLE IF EXISTS my_table;

CREATE TABLE my_table
(ID INT NOT NULL PRIMARY KEY
,DATE DATE NOT NULL
);

INSERT INTO my_table VALUES
(10 ,"2014-07-23"),
(7   ,"2014-07-24"),
(8   ,"2014-07-24"),
(9   ,"2014-07-24"),
(1   ,"2014-07-25"),
(2   ,"2014-07-25"),
(6   ,"2014-07-25"),
(3   ,"2014-07-26"),
(4   ,"2014-07-27"),
(5   ,"2014-07-28");

SELECT a.id
, a.date
, b.id b_id
, b.date b_date
FROM
( SELECT x.*
, COUNT(*) rank
FROM my_table x
JOIN my_table y
ON (y.date < x.date)
OR (y.date = x.date AND y.id <= x.id)
GROUP
BY x.date
, x.id
) a
LEFT
JOIN
( SELECT x.*
, COUNT(*) rank
FROM my_table x
JOIN my_table y
ON (y.date < x.date)
OR (y.date = x.date AND y.id <= x.id)
GROUP
BY x.date
, x.id
) b
ON b.rank = a.rank - 1;


+----+------------+------+------------+
| id | date       | b_id | b_date     |
+----+------------+------+------------+
| 10 | 2014-07-23 | NULL | NULL       |
|  7 | 2014-07-24 |   10 | 2014-07-23 |
|  8 | 2014-07-24 |    7 | 2014-07-24 |
|  9 | 2014-07-24 |    8 | 2014-07-24 |
|  1 | 2014-07-25 |    9 | 2014-07-24 |
|  2 | 2014-07-25 |    1 | 2014-07-25 |
|  6 | 2014-07-25 |    2 | 2014-07-25 |
|  3 | 2014-07-26 |    6 | 2014-07-25 |
|  4 | 2014-07-27 |    3 | 2014-07-26 |
|  5 | 2014-07-28 |    4 | 2014-07-27 |
+----+------------+------+------------+

... लेकिन आप इसे (तेज) चर के साथ भी कर सकते हैं।


जवाब के लिए 0 № 2

आप इस तरह से चयन करने के लिए एक पंक्ति आईडी जोड़ सकते हैं

SELECT @rowid:=@rowid+1 as rowid,
t1.* FROM yourdatabase.tablename t1, (SELECT @rowid:=0) as rowids;

फिर आप इनपुट से निचली पंक्ति को प्राप्त करने के लिए एक साधारण क्वेरी चला सकते हैं।


जवाब के लिए 0 № 3

यह एक उप क्वेरी का उपयोग करता है जो अपने खिलाफ तालिका से जुड़ता है, जहां एक तरफ यह वह तारीख होती है जिसे आप चेक कर रहे होते हैं और छोटी तिथियों के खिलाफ मिलान करते हैं। अधिकतम उच्चतम तिथि प्राप्त करने के लिए यह MAX का उपयोग करता है।

इसके बाद एक अन्य उप क्वेरी के खिलाफ जुड़ जाता है जो प्रत्येक तिथि के लिए उच्चतम आईडी प्राप्त करता है, जो उस पंक्ति के अन्य विवरण प्राप्त करने के लिए तालिका के खिलाफ भी जुड़ता है।

SELECT table.*
FROM table
INNER JOIN
(
SELECT MAX(a.date) AS latest_prev_date
FROM table1 a
INNER JOIN table1 b
ON a.date > b.date
WHERE a.date = "2014-07-26"
) sub0
ON table.date = sub0.latest_prev_date
INNER JOIN
(
SELECT date, MAX(ID) AS latest_prev_id
FROM table1
GROUP BY date
) sub1
ON table.ID = sub1.latest_prev_id
AND sub1.date = sub0.latest_prev_date

जवाब के लिए 0 № 4

यदि आप user_defined_variable का उपयोग करना चाहते हैं तो यह करने का एक तरीका है।

SELECT
tab.id, temp.id, temp.date
FROM
(
SELECT
@A:=@A + 1 AS rank_col, t.date, t.id
FROM
myTable t
CROSS JOIN (SELECT @A:=0) join_table
) AS tab
LEFT JOIN
(
SELECT
@B:=@B + 1 AS rank_col, t2 . *
FROM myTable t2
CROSS JOIN (SELECT @B:=0) join_table1
) temp ON temp.rank_col = tab.rank_col - 1;

डेमो