Есть ситуация. Есть новости скажем их 500, на разных страницах, он выводятся в разном порядке с пагинацией. И стала задача направить человека на страницу с новостью из случайного места (например с главной страницы). Т.е. необходимо получить номер строки в произвольной выборке mysql запроса при известном id новости.
Скажем выбирали по дате, и в выборке из 500 строк, нужная нам новость на 167 месте. А если по времени и записавшему, это 250 строка в ВЫБОРКЕ.
Можно это сделать mysql запросом, или придется перебирать всю выборку в поисках ?
вынесено из комментариев.
В MySQL вроде как нельзя получить номер записи, но можно сымитировать:
SQL Fiddle
MySQL 5.5 Schema Setup:
drop table if exists `table`;
create table `table` (
`f_id` int(10) null default null,
`f_value` int(10) null default null,
`f_count` int(10) null default null
);
INSERT INTO `table` VALUES
(1, 1, 5), (2, 3, 4), (3, 5, 3), (4, 2, 1), (5, 4, 2);
Query 1:
-- simple example
SET @a := 0
Results: Query 2:
SELECT (@a := @a + 1) AS `f_order_id`, `t1`.*
FROM `table` AS `t1`
WHERE `t1`.f_value <= 4
ORDER BY `t1`.f_value
Results:
| f_order_id | f_id | f_value | f_count |
|------------|------|---------|---------|
| 1 | 1 | 1 | 5 |
| 2 | 4 | 2 | 1 |
| 3 | 2 | 3 | 4 |
| 4 | 5 | 4 | 2 |
Кроме того - вас же устроит не номер текущей записи, а количество элементов до этой записи. Поэтому можно предложить следующий вариант:
SQL Fiddle
MySQL 5.5 Schema Setup:
drop table if exists `table`;
create table `table` (
`f_id` int(10) null default null,
`f_value` int(10) null default null,
`f_count` int(10) null default null
);
INSERT INTO `table` VALUES
(1, 1, 5), (2, 3, 4), (3, 5, 3), (4, 2, 1), (5, 4, 2);
Query 1:
-- first query
SELECT 'first query', `t1`.*
FROM `table` AS `t1`
WHERE `t1`.f_value <= 4
ORDER BY `t1`.f_value DESC
Results:
| first query | f_id | f_value | f_count |
|-------------|------|---------|---------|
| first query | 5 | 4 | 2 |
| first query | 2 | 3 | 4 |
| first query | 4 | 2 | 1 |
| first query | 1 | 1 | 5 |
Query 2:
-- first query with current id = 2
SELECT 'first query with current id = 2', `t1`.*
FROM `table` AS `t1`,
(SELECT * FROM `table`
WHERE `f_id` = 2) AS `t2`
WHERE `t1`.f_value <= 4 AND `t1`.f_value > `t2`.f_value
ORDER BY `t1`.f_value DESC
Results:
| first query with current id = 2 | f_id | f_value | f_count |
|---------------------------------|------|---------|---------|
| first query with current id = 2 | 5 | 4 | 2 |
Query 3:
-- second query
SELECT 'second query', `t1`.*
FROM `table` AS `t1`
WHERE `t1`.f_value <= 4
ORDER BY `t1`.f_count
Results:
| second query | f_id | f_value | f_count |
|--------------|------|---------|---------|
| second query | 4 | 2 | 1 |
| second query | 5 | 4 | 2 |
| second query | 2 | 3 | 4 |
| second query | 1 | 1 | 5 |
Query 4:
-- second query with current id = 5
SELECT 'second query with current id = 5', `t1`.*
FROM `table` AS `t1`,
(SELECT * FROM `table`
WHERE `f_id` = 5) AS `t2`
WHERE `t1`.f_value <= 4 AND `t1`.f_count < `t2`.f_count
ORDER BY `t1`.f_count
Results:
| second query with current id = 5 | f_id | f_value | f_count |
|----------------------------------|------|---------|---------|
| second query with current id = 5 | 4 | 2 | 1 |
Query 5:
-- third query
SELECT 'third query', `t1`.*
FROM `table` AS `t1`
WHERE `t1`.f_value <= 4 AND `t1`.f_count <= 4
ORDER BY `t1`.f_count
Results:
| third query | f_id | f_value | f_count |
|-------------|------|---------|---------|
| third query | 4 | 2 | 1 |
| third query | 5 | 4 | 2 |
| third query | 2 | 3 | 4 |
Query 6:
-- third query with current id = 2
SELECT 'third query with current id = 2', `t1`.*
FROM `table` AS `t1`,
(SELECT * FROM `table`
WHERE `f_id` = 2) AS `t2`
WHERE `t1`.f_value <= 4 AND `t1`.f_count <= 4 AND `t1`.f_count < `t2`.f_count
ORDER BY `t1`.f_count
Results:
| third query with current id = 2 | f_id | f_value | f_count |
|---------------------------------|------|---------|---------|
| third query with current id = 2 | 4 | 2 | 1 |
| third query with current id = 2 | 5 | 4 | 2 |
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Подскажите пожалуйста, как корректно реализовать парсер данныхОписание: Имею длинный список, все данные из этого списка удаляются раз в месяц,...