Измените запрос MYSQL, чтобы выбрать только определенные строки, используемые как своего рода индекс - PullRequest
1 голос
/ 21 января 2011

Я пишу форму поиска для простого форума, но мне не удается найти решение, чтобы выбрать только те поля, которые меня интересуют. Таблица форума с именем «Сообщения» (MySql) использует следующую структуру:

MessageID - FirstMsg - Content
201 - 0 - Jack and Rose
202 - 201 - Rose
203 - 201 - Jack, Rose, David
204 - 0 - Bill
205 - 204 - Rose
206 - 0 - Rose and David
207 - 206 - David

Основная проблема заключается в том, что используемая мной страница форума php распознает сообщения с FirstMsg 0 как «родительские», а сообщения с FirstMsg, отличающиеся от 0, - как ответы на сообщение с 0 и MessageID, равным их FirstMsg.

ы. строка с 201 в качестве MessageID 201 является родительской для 202 и 203, которые будут рассматриваться как ответы на сообщение 201.

С помощью MySql-запроса и php я легко получаю содержимое:

$MySql = "SELECT * FROM Messages WHERE Content LIKE '%$Search%'" ORDER BY Date DESC LIMIT 1, 30";
$Result = mysql_query($MySql);
while($rs = mysql_fetch_array($Result)) {

}

Например, при поиске Rose I, повторяя содержимое в цикле while:

201 - 0 - Jack and Rose
202 - 201 - Rose
203 - 201 - Jack, Rose, David
205 - 204 - Rose
206 - 0 - Rose and David

Когда мне нужно получить с запросом только «родительские» элементы, даже «Роза», они отсутствуют в родительском сообщении, а только в одном из ответов, например:

201 - 0 - Jack and Rose
204 - 0 - Bill
206 - 0 - Rose and David

Можно сделать это, изменив только запрос MySql? Мне это нужно, потому что сам запрос используется на одной и той же странице для перемещения между «страницами», генерируемыми php, когда их количество увеличивается после максимального количества сообщений на номер страницы. Заранее спасибо за любую помощь.

Ответы [ 2 ]

1 голос
/ 21 января 2011

Вам необходимо отфильтровать результаты следующим образом:

 - set finalResultSet as nothing
 - if the FirstMsg = 0 : then union MessageID with finalResultSet
 - else : union FirstMsg with finalResultSet

Вы можете выполнить фильтрацию в PHP с указанными выше условиями.

Чтобы отфильтровать его в MySQL, я подумал о чем-то вроде этого:


(
    SELECT MessageID FROM Messages
    WHERE 
        FirstMsg=0 AND
        Content LIKE '%$Search%'
    ORDER BY Date DESC LIMIT 1, 30
)
UNION
(
    SELECT FirstMsg FROM Messages
    WHERE 
        Content LIKE '%$Search%'
    ORDER BY Date DESC LIMIT 1, 30
)

Очень неэффективно. Я не очень хорош в запросах MySQL. Но вы наверняка поняли, не так ли? Кроме того, я уверен, что здесь есть много экспертов, которые предложат лучшее решение. Удачи! : -)

0 голосов
/ 21 января 2011

Если вы хотите получить только родительские сообщения:

SELECT DISTINCT p.*
FROM Messages m JOIN Messages p
    ON m.FirstMsg = p.MessageID
        OR (m.FirstMsg = 0 AND m.MessageID = p.MessageID)
WHERE m.Content LIKE '%$Search%'
ORDER BY m.Date DESC LIMIT 1, 30

Если вы хотите отсортировать по родительскому сообщению, измените m.Date на p.Date

...