Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум MySQL

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Выбрать по одной статье из каждой категории
 
 автор: Лена   (24.07.2009 в 16:49)   письмо автору
 
 

Это запрос выбирает все статьи(n.nid) из перечисленных категорий(td.tid):
SELECT n.title nt, n.nid nn,td.tid
FROM node n
JOIN term_node tn ON n.nid = tn.nid
JOIN term_data td ON tn.tid = td.tid
JOIN vocabulary v ON td.vid = v.vid
WHERE v.vid =16
AND td.tid
IN ( 129, 130, 131) 


А вот так я хочу выбрать из каждой категории по одной статье(с максимальным nid)
SELECT n.title nt, MAX( n.nid ) nn,td.tid
FROM node n
JOIN term_node tn ON n.nid = tn.nid
JOIN term_data td ON tn.tid = td.tid
JOIN vocabulary v ON td.vid = v.vid
WHERE v.vid =16
AND td.tid
IN ( 129, 130, 131 ) 
GROUP BY td.tid

Вторая выборка идет неправильно. Почему?

  Ответить  
 
 автор: Жмурик   (24.07.2009 в 17:11)   письмо автору
 
   для: Лена   (24.07.2009 в 16:49)
 

[поправлено модератором]

  Ответить  
 
 автор: vadimka   (24.07.2009 в 17:53)   письмо автору
 
   для: Жмурик   (24.07.2009 в 17:11)
 

tid - это номер рубрики? и он есть в таблице новостей? может попробовать группировать по

n.tid

?

  Ответить  
 
 автор: Лена   (24.07.2009 в 23:10)   письмо автору
 
   для: vadimka   (24.07.2009 в 17:53)
 

Сделала с вложенным запросом:

<?php
$block_content 
'';
$sql "SELECT MAX( n.nid ) nn
FROM node n
JOIN term_node tn ON n.nid = tn.nid
JOIN term_data td ON tn.tid = td.tid
JOIN vocabulary v ON td.vid = v.vid
WHERE v.vid =%d
GROUP BY td.tid
HAVING td.tid
IN ( 129, 130, 131)
                "
;
         
$result db_query($sql,16);
         if(!
$result) return drupal_not_found();
         while (
$linky db_fetch_object($result)) {
        
$sq "SELECT n.title nt FROM node n WHERE n.nid =" $linky->nn;
            
$res db_query_range($sq,0,3);
            if(!
$res) return drupal_not_found();
                while(
$title db_fetch_object($res)){
                
$tl $title->nt;
                
$id $linky->nn;
                
$block_content .= l($tl,'linky/' $id);
                
                }
         }
?>

  Ответить  
 
 автор: Trianon   (24.07.2009 в 23:18)   письмо автору
 
   для: Лена   (24.07.2009 в 23:10)
 

ну можно было же LEFT JOINом вложенный запрос присобачить...
http://www.softtime.ru/forum/read.php?id_forum=3&id_theme=66746

td.tid IN () лучше во where

  Ответить  
 
 автор: Лена   (25.07.2009 в 20:31)   письмо автору
 
   для: Trianon   (24.07.2009 в 23:18)
 

>ну можно было же LEFT JOINом вложенный запрос присобачить...
Можно, только так не получается. Делала аналогично предложенной вами ссылке.

SELECT MAX( nt.nid ) nn, nt.title ntt
FROM (
SELECT n.title, n.nid
FROM node n
)nt
JOIN node nd ON nd.nid = nt.nid
JOIN term_node tn ON n.nid = tn.nid
JOIN term_data td ON tn.tid = td.tid
JOIN vocabulary v ON td.vid = v.vid
WHERE v.vid =16
GROUP BY td.tid
HAVING td.tid
IN ( 129, 130, 131 ) 
LIMIT 0 , 30 


#1046 - No database selected

>td.tid IN () лучше во where
я вначале тоже во where написала, потом вспомнила про having

  Ответить  
 
 автор: Trianon   (25.07.2009 в 21:22)   письмо автору
 
   для: Лена   (25.07.2009 в 20:31)
 

По ссылке предлагалось весь SELECT MAX()... убрать во вложенный подзапрос, сростив последний с исходной таблицей.

  Ответить  
 
 автор: Лена   (25.07.2009 в 21:51)   письмо автору
 
   для: Trianon   (25.07.2009 в 21:22)
 


SELECT n.title nt, n.nid
FROM node n
WHERE n.nid
IN (
SELECT MAX( n.nid ) nn
FROM node n
JOIN term_node tn ON n.nid = tn.nid
JOIN term_data td ON tn.tid = td.tid
JOIN vocabulary v ON td.vid = v.vid
WHERE v.vid =16
GROUP BY td.tid
HAVING td.tid
IN ( 129, 130, 131 ) 
)


Так?
Спасибо.

  Ответить  
 
 автор: Trianon   (25.07.2009 в 21:59)   письмо автору
 
   для: Лена   (25.07.2009 в 21:51)
 

Вот Ваш

SELECT MAX( n.nid ) nn
FROM node n
JOIN term_node tn ON n.nid = tn.nid
JOIN term_data td ON tn.tid = td.tid
JOIN vocabulary v ON td.vid = v.vid
WHERE v.vid =%d
GROUP BY td.tid
HAVING td.tid
IN ( 129, 130, 131) 


Который я бы изменил на

SELECT MAX( n.nid ) nn, td.tid
  FROM node n
    JOIN term_node tn ON n.nid = tn.nid
    JOIN term_data td ON tn.tid = td.tid
    JOIN vocabulary v ON td.vid = v.vid
      WHERE v.vid =%d AND td.tid IN  ( 129, 130, 131)
GROUP BY td.tid


Далее
SELECT s.nn, n1.title 
   FROM  (исходный запрос) AS s
   JOIN node n1 ON n1.nid = nn

Далее
SELECT s.nn, n1.title 
   FROM 
   (
    SELECT MAX( n.nid ) nn, td.tid
      FROM node n
        JOIN term_node tn ON n.nid = tn.nid
        JOIN term_data td ON tn.tid = td.tid
        JOIN vocabulary v ON td.vid = v.vid
          WHERE v.vid =%d AND td.tid IN  ( 129, 130, 131)
    GROUP BY td.tid
   ) AS s
   JOIN node n1 ON n1.nid = s.nn


Дальше можно дописать ORDER BY и LIMIT

  Ответить  
 
 автор: Лена   (25.07.2009 в 22:22)   письмо автору
 
   для: Trianon   (25.07.2009 в 21:59)
 

Спасибо, все ясно. Такого еще не приходилось делать.
У вас в последнем коде опечатка - FORM и в последней строке не указали алиас: JOIN node n1 ON n1.nid = s.nn

  Ответить  
 
 автор: Trianon   (25.07.2009 в 22:39)   письмо автору
 
   для: Лена   (25.07.2009 в 22:22)
 

ага, поправил.

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования