SQL - Найти, где в запросе будет определенная строка - PullRequest
3 голосов
/ 17 октября 2008

Я работаю в системе форумов. Я пытаюсь позволить пользователям видеть сообщения, которые они сделали. Чтобы эта ссылка работала, мне нужно перейти на страницу по конкретной теме, в которой они размещены, в которой содержится их сообщение, чтобы могли работать закладки и т. Д. Так как это новая функция в старый форум, я хотел бы закодировать его так, чтобы система форумов не отслеживала каждое сообщение, а могла просто заполнять этот список автоматически.

Я знаю, как заполнить список, но мне нужно сделать это:

Учитывая запрос, где появится строка X в запросе (гарантированно уникальная при некоторой комбинации идентификаторов)? Как и сколько строк мне нужно сместить, чтобы добраться до него? Это будет в отсортированном запросе.

В идеале я хотел бы сделать это с помощью SQL, а не PHP, но если это невозможно сделать в SQL, я думаю, что это тоже ответ. ^ _ ^

Спасибо

Ответы [ 7 ]

3 голосов
/ 17 октября 2008

хм, это решение делает несколько предположений, но я думаю, что оно должно работать для того, что вы пытаетесь сделать, если я правильно понимаю:

SELECT count(post_id) FROM posts
  WHERE thread_id = '{$thread_id}' AND date_posted <= '{$date_posted}'

это даст вам количество строк в определенной ветке (которое, как я полагаю, вы предварительно рассчитали), равное или более раннее, чем дата публикации (конкретная публикация пользователя).

на основе этой информации (скажем, 15-й пост в этой теме) вы можете рассчитать, на какой странице будет получен результат, основываясь на значениях подкачки на форумах. т.е.

// dig around forum code for number of items per page
$itemsPerPage = 10; // let's say
$ourCount = getQueryResultFromAbove(); 

// this is the page that post will be on
$page = ceil($ourCount / $itemsPerPage);

// for example
$link = '/thread.php?thread_id='.$thread_id.'&page='.$page;
2 голосов
/ 17 октября 2008

Если вы используете MSSQL, вы можете использовать функцию ROW_NUMBER () , чтобы добавить автоматически увеличивающееся число к каждой строке в запросе.

Хотя я не знаю, что хорошего это тебе даст. Но он будет делать то, что вы просили - назначить номер позиции строки в наборе результатов данного запроса.

Если это написано в ph, вы, вероятно, используете mySQL.

0 голосов
/ 17 октября 2008

Большинство платформ SQL имеют собственное расширение столбцов IDENTITY или последовательностей, которые увеличиваются с каждым элементом в таблице. У большинства также есть временные таблицы.

CREATE TABLE OF QUERY RESULTS WITH IDENTITY COLUMN

INSERT INTO TABLE  
QUERY  
ORDER BY something

тогда столбец идентификаторов - это число в запросе, и он сообщает, сколько записей до или после него.

Важно что-то заказывать. В противном случае вы можете получать разные заказы с каждым запросом, в этом случае ваш номер ничего не значит ...

0 голосов
/ 17 октября 2008

Я думаю, что вы имеете в виду нечто подобное (MySQL)?

START TRANSACTION;

SET @rows_count = 0;
SET @user_id = ...;
SET @page_size = ...;

SELECT 
     @rows_count := @rows_count + 1 AS RowNumber
    ,CEIL( @rows_count / @page_size ) AS PageNumber
FROM ForumPost P
WHERE 
    P.PosterId = @user_id;

ROLLBACK;
0 голосов
/ 17 октября 2008

Я согласен с Троем, вы, вероятно, ошибаетесь, чтобы исправить это, нам нужно знать больше деталей, но в любом случае в MySQL вы можете сделать это так

SET @i=0;
SELECT number FROM (SELECT *,@i:=@i+1 as number FROM Posts 
ORDER BY <order_clause>) as a WHERE <unique_condition_over_a>

В PostgreSQL вы можете использовать временную последовательность:

CREATE TEMPORARY SEQUENCE counter;
SELECT number FROM (SELECT *,nextval('sequence') as number FROM Posts 
ORDER BY <order_clause>) as a WHERE <unique_condition_over_a>
0 голосов
/ 17 октября 2008

Если продолжить предложение Троя, вам понадобится подзапрос, в основном,

 select row_number() OVER(ORDER BY MessageDate DESC) 
 AS 'RowNum', * from MESSAGES

затем поставьте внешний выбор для реальной работы:

  select RowNum, Title, Body, Author from (
  select row_number() OVER(ORDER BY MessageDate DESC) 
  AS 'RowNum', * from MESSAGES)
  where AuthorID = @User

Используйте rownum для расчета номера страницы.

0 голосов
/ 17 октября 2008

Дело в том, что в базах данных нет реального «порядка». Вы можете использовать оператор SCOPE_IDENTITY, чтобы вернуть уникальный идентификатор вставленной записи, а затем написать какую-то функцию для разбивки на страницы, пока эта запись не будет найдена.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...