|
|
|
| Это запрос выбирает все статьи(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 в 16:49)
| | [поправлено модератором] | |
|
|
|
|
|
|
|
для: Жмурик
(24.07.2009 в 17:11)
| | tid - это номер рубрики? и он есть в таблице новостей? может попробовать группировать по
? | |
|
|
|
|
|
|
|
для: 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);
}
}
?>
|
| |
|
|
|
|
|
|
|
для: Лена
(24.07.2009 в 23:10)
| | ну можно было же LEFT JOINом вложенный запрос присобачить...
http://www.softtime.ru/forum/read.php?id_forum=3&id_theme=66746
td.tid IN () лучше во where | |
|
|
|
|
|
|
|
для: 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 | |
|
|
|
|
|
|
|
для: Лена
(25.07.2009 в 20:31)
| | По ссылке предлагалось весь SELECT MAX()... убрать во вложенный подзапрос, сростив последний с исходной таблицей. | |
|
|
|
|
|
|
|
для: 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 )
)
|
Так?
Спасибо. | |
|
|
|
|
|
|
|
для: Лена
(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 | |
|
|
|
|
|
|
|
для: Trianon
(25.07.2009 в 21:59)
| | Спасибо, все ясно. Такого еще не приходилось делать.
У вас в последнем коде опечатка - FORM и в последней строке не указали алиас: JOIN node n1 ON n1.nid = s.nn | |
|
|
|
|
|
|
|
для: Лена
(25.07.2009 в 22:22)
| | ага, поправил. | |
|
|
|