我有一个类似的查询:
$query = "SELECT * FROM `press`"
." WHERE "SOME CONDITONS
." GROUP BY `pressID`"
." ORDER BY `date` DESC"
.";";
此查询返回按下的数组,按date
排序。
我需要修改此查询,以便在前后只有一个按下(两个查询,每个查询一个)特定ID,id字段为pressID
。
有什么想法吗?
我可以在查询后通过特定处理来做到这一点,但我认为如果我直接在查询中这样做会更好。
谢谢!
编辑:
我的查询返回一个有序的数据数组,如:
array(XXX) {
[0]=>
array(XXX) {
["pressID"]=> string(4) "1811"
},
[1]=>
array(XXX) {
["pressID"]=> string(3) "450"
}
,
[2]=>
array(XXX) {
["pressID"]=> string(1) "3"
}
......
}
我需要修改此查询(或创建一个新查询)以仅获取特定id之前的元素,并在第二个查询中获取特定id之后的元素。
如果我有id = 450,我需要输入id = 1811之前的查询,按下id = 3的查询后。
答案 0 :(得分:2)
如果您只想要前后行,而不是中间行,可能是这样的?获取最低ID和最大ID小于特定ID:
$query = "SELECT * FROM `press`"
." WHERE pressID = (SELECT MIN(pressID) FROM `press` WHERE pressID > specificID)"
." OR pressID = (SELECT MAX(pressID) FROM `press` WHERE pressID < specificID)"
." GROUP BY `date`"
." ORDER BY `date` DESC"
.";";
编辑:因为您按日期订购:
SELECT * FROM press
WHERE date = (
SELECT MIN(date) FROM press
WHERE
date > (SELECT date FROM press WHERE pressID = specific_id)
)
OR date = (
SELECT MAX(date) FROM press
WHERE
date < (SELECT date FROM press WHERE pressID = specific_id)
)
GROUP BY date
ORDER BY date;
答案 1 :(得分:1)
正如其他人在评论中指出的那样,您需要澄清模型的某些方面。你的pressID是独一无二的吗?每个日期只有一个pressID吗?现在,如果两个问题的答案都是肯定的,为什么不使用limit
?
首先,您检索“特定ID ”的日期:
SELECT date FROM press WHERE pressID = specific_id;
然后您可以轻松创建两个查询:
对于之前的那个:
SELECT * FROM press
WHERE date <= specific_id_date** and pressID <> specific_id
GROUP BY date
ORDER BY date DESC
LIMIT 1;
对于后者:
SELECT * FROM press
WHERE date >= specific_id_date and pressID <> specific_id
GROUP BY date
ORDER BY date ASC
LIMIT 1;