Mysql Query найти подписчика статьи / последний без подписчика - PullRequest
0 голосов
/ 23 января 2012

Я пытаюсь сделать небольшой магазин на основе предоставленного списка статей - как правило, без проблем.НО в этом списке есть статьи, которые имеют более новые версии с новыми номерами статей.например:

Article Nr. | Title  | Price | New Article  
1001        | Test 1 | 10.0  | 1003  
1002        | Test 2 | 20.0  |   
1003        | Test 3 | 13.0  |  ( = new Version of Test 1)

Пользователь должен иметь возможность искать во всех номерах статей, чтобы получить название и цену.Если он наберет «старое» число 1001, он должен получить название и цену новой версии: 1003. (Но это только простой пример, он не ограничен тем, сколько статей находится между искомым артикулом и последним артикулом)

Прежде чем я напишу комплексное решение в php, я хотел бы спросить, есть ли "более простой" способ получить правильную статью с помощью специального выбора базы данных?

-

Просто подумайте, может ли следующий (обобщенный) php-код оказаться намного проще, чем запрошенный запрос mysql:

function searcharticle(search_nr){ 
 SELECT nr, title, price, newnr FROM articles WHERE nr = '$search_nr';
 if(empty($newnr)){ $title = ... }else{ searcharticle($newnr); }
}

как вы думаете?

Ответы [ 2 ]

0 голосов
/ 23 января 2012

Это должно помочь, по крайней мере, до 4 уровней в иерархии обновленных предметов ...

select
      Articles.*
   from
      ( select
            IF( a4.ArticleNr is not null, a4.ArticleNr,
               IF( a3.ArticleNr is not null, a3.ArticleNr,
                  IF( a2.ArticleNr is not null, a2.ArticleNr, A1.ArticleNr ))) as FinalArticle
           from
              Articles a1
                 left join Articles a2
                    on a1.NewArticle = a2.ArticleNr
                    left join Articles a3
                       on a2.NewArticle = a3.ArticleNr
                       left join Articles a4
                          on a3.NewArticle = a4.ArticleNr
           where
              a1.ArticleNr = '1001' ) QualifiedArticle

      JOIN Articles
         ON QualifiedArticle.FinalArticle = Articles.ArticleNr

Вложенный IF (IF (IF ())) начнется с 4-го поколения.«самая новая» версия статьи ... если она найдена, она получает 3-ю самую новую, 2-ую самую новую для той статьи, которую фактически предоставил пользователь.Поскольку это самостоятельное соединение, оно вернет только одну запись и будет достаточно быстрым.Исходя из этого, он объединяет одну заключительную запись с таблицей статей, которую находит THAT MATCHED, чтобы получить самую «новую» запись.

0 голосов
/ 23 января 2012

Управление иерархическими данными в mysql - непростая задача, но это возможно.

Предполагая, что в таблице articles есть article_num, Title, Price, new_article столбцы, все из которых имеют тип VARCHAR, с пустой строкой new_article для новейших версий, это должно помочь найти заголовок и цену самой новой версии данной статьи:

SELECT a.Title, a.Price FROM articles a
JOIN
( SELECT 
  @article_num as prev_version,
  @article_num := 
     ( SELECT new_article
          FROM articles
       WHERE article_num = prev_version ) AS article_num
  FROM
    ( SELECT @article_num := '1001' ) AS starting_num,
    articles
    WHERE @article_num <> '' ) newer_articles
ON newer_articles.prev_version = a.article_num 
   AND newer_articles.article_num = ''

Что касается вашего решения php - да, рекурсивный подход на языке, который позволяет намного проще кодировать список смежности, а также легче читать и поддерживать, а производительность не должна быть проблемой, так как не будет так много новых версии любой статьи.

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