Сложный sql запрос, помогите.

seosniks
На сайте с 13.08.2007
Offline
389
1213

Добрый вечер уважаемые форумчане.

Столкнулся с такой ситуацией.

есть запрос на выборку данных

пример

 $sql = mysql_query("SELECT * FROM jb_board  where  `date_add`  >= DATE_SUB(CURRENT_DATE, INTERVAL ".$day." DAY) order by  `id_category`  asc  limit  10");   

все работает, но мне надобно разделить новости по категориям.

сейчас выборка и сортировка работает.

и с помощью указанного выше запроса, из талицы новостей выводятся номера

категорий

отсортированны

так

1

1

2

2

3

3 и так далее.

новости берутся из таблицы jb_board , поле id_category = root_category в таблице категорий.

категории берутся из таблицы jb_board_cat поле root_category

ка объеденить 2 талицы,

jb_board
jb_board_cat

мне нужно

разделять например тегом <hr>

новости между категориями

тоесть примерно так

новость 1 кат 1
новость 2 кат 1
<hr>
новость 1 кат 2
новость 2 кат 2
<hr>
новость 1 кат 3
новость 2 кат 3

Я так понимаю что надо делать выборку из 2х таблиц

затем проверять как то новость которая была добавлена, или будет добавлена, на номер категории, и если они разные то вставлять hr

Буду очень благодарен за вашу помощь, в составлении запроса.

[Удален]
#1

Добавьте пожалуйста структуры таблиц.

S0
На сайте с 20.11.2010
Offline
32
#2

seosniks, если выводить названия категорий не требуется, то вторая таблица не нужна. Тут чисто логика кода PHP на вывод. Т.е. я так думаю, сейчас что-то типа:

while ($row = mysql_fetch_array($sql)) {
echo $row["newstext"];
}

Правим PHP на:

$cat = 0;
while ($row = mysql_fetch_array($sql)) {
if ($cat != $row["id_category"]) {
if ($cat > 0) echo "<hr />";
$cat = $row["id_category"];
}
echo $row["newstext"];
}
[Удален]
#3

а чего сложного то? два столбца в order by

ORDER BY айди категории, айди новости

получится сортировка по категории в пределах категории новости отсортируются

направление сортировки выбираешь нужное

примерно такое должно получится

select нужные поля из таблицы jb_board_cat, нужные поля из таблицы jb_board

from jb_board_cat, jb_board_cat

where (jb_board_cat.root_category=jb_board_cat=root_category)

and (другие условия для выборки)

order by первое нужное поле для сортировки, второе нужное поле для сортировки

+ как сказано было выше правильная=нужная реализация выдачи этого добра на страницу

jb_board , поле id_category = root_category в таблице категорий.

категории берутся из таблицы jb_board_cat

maldivec
На сайте с 04.11.2008
Offline
160
#4


SELECT jb_board.*, jb_board_cat.* (тут лучше нужные поля указать)
FROM jb_board
LEFT JOIN jb_board_cat ON jb_board_cat.root_category = jb_board.id_category
WHERE `date_add` >= DATE_SUB(CURRENT_DATE, INTERVAL ".$day." DAY)
ORDER BY `id_category` ACS
LIMIT 10
seosniks
На сайте с 13.08.2007
Offline
389
#5
OnMed:
Добавьте пожалуйста структуры таблиц.

Вот структуры нужных полей в таблицах.

-- Структура таблицы `jb_board`

--

CREATE TABLE `jb_board` (
`id` int(11) NOT NULL auto_increment,
`id_category` smallint(6) NOT NULL,
`user_id` int(11) NOT NULL default '0',
`type` enum('s','p','u','o') NOT NULL default 'p',
`autor` varchar(255) NOT NULL,
`title` varchar(255) NOT NULL,
`email` varchar(255) NOT NULL,
`city` varchar(255) NOT NULL,
`city_id` smallint(6) NOT NULL,
`url` varchar(255) NOT NULL,
`click` smallint(6) NOT NULL default '0',
`contacts` text NOT NULL,
`text` text NOT NULL,
`date_add` datetime NOT NULL,
PRIMARY KEY (`id`),
KEY `id_category` (`id_category`),
KEY `city_id` (`city_id`),
KEY `user_id` (`user_id`),
KEY `email` (`email`)
) ENGINE=MyISAM AUTO_INCREMENT=1837 DEFAULT CHARSET=utf8 PACK_KEYS=0 CHECKSUM=1 AUTO_INCREMENT=1837 ;



-- Структура таблицы `jb_board_cat`
--

CREATE TABLE `jb_board_cat` (
`id` int(11) NOT NULL auto_increment,
`root_category` int(11) NOT NULL default '0',
`child_category` smallint(1) NOT NULL default '0',
`name_cat` varchar(255) NOT NULL,
`sort_index` smallint(3) NOT NULL,
PRIMARY KEY (`id`),
KEY `root_category` (`root_category`)
) ENGINE=MyISAM AUTO_INCREMENT=333 DEFAULT CHARSET=utf8 AUTO_INCREMENT=333 ;

Из таблицы

`jb_board_cat`

нужно выбрать id name_cat

и каждое новое значение из root_category

разделяем с помощью </hr>

В общем с тормозил я не по децки. )))

из таблицы категорий надо было брать ID поле, а я брал root_category.

ID соответствует конкретному разделу, а root_category записям в этом разделе.

теперь как то надо проверять поле d_category. и между разными значениями вставлять разделитель Hr

щас буду копать, как их разделить.

[Удален]
#6

SELECT news.id,cat.id,cat.root_category,cat.name_cat FROM jb_board news,jb_board_cat cat  
WHERE news.date_add >= DATE_SUB(CURRENT_DATE, INTERVAL ".$day." DAY)
GROUP BY cat.root_category
ORDER BY news.id_category ASC
limit 10

Проверьте, должно работать!

seosniks
На сайте с 13.08.2007
Offline
389
#7
OnMed:
SELECT news.id,cat.id,cat.root_category,cat.name_cat FROM jb_board news,jb_board_cat cat  

WHERE news.date_add >= DATE_SUB(CURRENT_DATE, INTERVAL ".$day." DAY)
GROUP BY cat.root_category
ORDER BY news.id_category ASC
limit 10


Проверьте, должно работать!

Я с запросом разобрался, ошибку допускал, в поле ID категории.

Вот

$sql = mysql_query("SELECT * FROM jb_board, jb_board_cat

WHERE jb_board.id_category = jb_board_cat.id and `date_add` >= DATE_SUB(CURRENT_DATE, INTERVAL ".$day." DAY) order by `id_category` $sort $limit");

все пашет, теперь думаю как мне разделитель сунуть.

$id= ' ' .$r['id'].' ';

echo $id_category= '' .$r['id_category'].'';

вот что получаю сейчас 50 50 50 50 55 55 55 55 64 64

Теперь осталось поделить с помощью <hr>

50 50 50 50 <hr>55 55 55 55 <hr>64 64

тоесть надо сравнивать, значение ID в отработанном цикле

с значением ID в новом цикле

Можно ли передавать скрытым input?

Дело в том что данные отправляются но $_POST их не принимает.

'<FORM action="" method="post">

<INPUT type="hidden" name="idcat" value="'.$id_category.'">

</FORM>';

[Удален]
#8
seosniks:
Я с запросом разобрался, ошибку допускал, в поле ID категории.

Вот
$sql = mysql_query("SELECT * FROM jb_board, jb_board_cat

WHERE jb_board.id_category = jb_board_cat.id and `date_add` >= DATE_SUB(CURRENT_DATE, INTERVAL ".$day." DAY) order by `id_category` $sort $limit");


все пашет, теперь думаю как мне разделитель сунуть.
$id= ' ' .$r['id'].' ';
echo $id_category= '' .$r['id_category'].'';


вот что получаю сейчас 50 50 50 50 55 55 55 55 64 64
Теперь осталось поделить с помощью <hr>

50 50 50 50 <hr>55 55 55 55 <hr>64 64
тоесть надо сравнивать, значение ID в отработанном цикле

с значением ID в новом цикле


Можно ли передавать скрытым input?
Дело в том что данные отправляются но $_POST их не принимает.


'<FORM action="" method="post">
<INPUT type="hidden" name="idcat" value="'.$id_category.'">
</FORM>';

Почему Вам не использовать секцию GROUP BY ?

OnMed добавил 20.05.2011 в 17:36

Извините, забыл в своем варианте в секции WHERE соединить таблицы по news.id_category = cat.id

Окончательный вариант:


SELECT news.id,cat.id,cat.root_category,cat.name_cat FROM jb_board news,jb_board_cat cat
WHERE news.date_add >= DATE_SUB(CURRENT_DATE, INTERVAL ".$day." DAY) AND news.id_category = cat.id
GROUP BY cat.root_category
ORDER BY news.id_category ASC
limit 10

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий