Таблицы: articles, news, milo.
Строение таблиц: id,title,description,text,DATE
Я хочу реализовать выборку из трёх таблиц данные, сортировать по дате и отобразить последние 5 строк, итого должно получиться что-то наподобии:
20.01.2010 articles
19.01.2010 news
18.01.2010 news
17.01.2010 articles
16.01.2010 milo
Из одной это выглядит так:
$result = mysql_query ("SELECT * FROM news ORDER BY date DESC LIMIT 5",$db);
while ($myrow = mysql_fetch_assoc ($result))
{echo "ля-ля-ля"; }
Просто не знаю как реализовать, ведь имена у строения одинаковые.
Есть предположения, может быть сделать:
SELECT news.title AS ntitle, articles.title AS atitle... сгруппировать GROUP BY по дате, а потом вывести... хотя не знаю как это написать! А так же ещё и Лимит 5 сделать общий... вообще ужас для меня! Может кто-нибудь подскажет, как это сделать???
Есть другой вариант, более простой, создать одну общую таблицу и переписать немного код этого сайта, но огорчает то, что сайт уже готов, осталось лишь добавить эту вещь для сайта... а как сделать - не знаю.
Жду Вашей помощи...
Спустя 6 часов, 22 минуты, 35 секунд (7.01.2010 - 12:09) Gabriel написал(а):
поле с датами в каждой таблеце храниться или только в одной?
Спустя 1 час, 7 минут, 44 секунды (7.01.2010 - 13:17) inpost написал(а):
в каждой таблице есть поле дата...
У меня родилась идея, сделать через многомерный массив, только очень сложно разобраться, как с ним работать, ни разу не пробовал их создавать, поэтому застрял...
В таком варианте елементы будут добавляться в массив? И как потом вывести 5 элементов массива (после сортировки, с сортировкой, я думаю, у меня проблем не будет)?
У меня родилась идея, сделать через многомерный массив, только очень сложно разобраться, как с ним работать, ни разу не пробовал их создавать, поэтому застрял...
$result = mysql_query ("SELECT * FROM news ORDER BY date DESC LIMIT 5",$db);
while ($myrow = mysql_fetch_array ($result))
{
$ship = array($myrow['date'] => array($myrow['id']."<br />",$myrow['title']."<br />",$myrow['description']."<br />",$myrow['text']));
}
В таком варианте елементы будут добавляться в массив? И как потом вывести 5 элементов массива (после сортировки, с сортировкой, я думаю, у меня проблем не будет)?
Спустя 9 минут, 50 секунд (7.01.2010 - 13:27) Gabriel написал(а):
велосипеды придумываем? зачем?выбираеш все что тебе нужно из всех таблиц и ставиш порядок вывода по полю даты одной из таблиц или некатит?
ну или я снова что-то упустил, а почему запрос на выборку из одной таблицы?
ну или я снова что-то упустил, а почему запрос на выборку из одной таблицы?
Спустя 19 минут, 25 секунд (7.01.2010 - 13:46) inpost написал(а):
А как сделать выборку из нескольких таблиц, чтоб потом сделать вывод по полю "дата"???
Я, просто, честно не понимаю как это делать...
Я, просто, честно не понимаю как это делать...
Спустя 2 часа, 58 минут, 42 секунды (7.01.2010 - 16:45) sergeiss написал(а):
Цитата (inpost @ 7.01.2010 - 06:47) |
Короткое описание: существует 3 таблицы с одинаковым строением, разное содержание. Таблицы: articles, news, milo. Строение таблиц: id,title,description,text,DATE |
А зачем изначально делать геморрой на свою.... голову ?
Почему бы не сделат одну таблицу, в которой добавить еще одно поле для идентификации типа содержимого: id,title,description,text,DATE,type - и делай любые выборки. Или данных - сотни тысяч (или миллионы) строк???
Спустя 1 час, 58 минут, 41 секунда (7.01.2010 - 18:44) inpost написал(а):
Просто не хочется переделывать часть сайта, который полностью готов. Просто эту функцию попросили добавить...
Все, проблема решена, я решил через массивы, вот пример:
Все, проблема решена, я решил через массивы, вот пример:
<?php
$i = 0;
$result = mysql_query ("SELECT * FROM news ORDER BY date DESC LIMIT 5",$db);
while ($myrow = mysql_fetch_assoc ($result))
{
$arr[$i] = array("date"=>"<table width='100%' border='0' cellspacing='0' cellpadding='8' class='centertable' align='center'>
<tr valign='top'><td colspan='2'> <br /><h2 align='left'><span class='date'>(дата: ".$myrow['date'].")</span>", "title"=>$myrow['title']."</h2>", "img"=>"</td></tr><tr valign='top'><td valign='middle'><img border='0' src='img/news/".$myrow['img']."' align='center'></td><td><div align='justify'>", "description"=>$myrow['description']."<br /> </div><div align='right'><a href='news_view.php?id=", "id"=>$myrow['id']."'>читать далее...</a></div></td></tr><tr valign='top'><td colspan='2'> </td></tr></table>");
$i++;
}
$result = mysql_query ("SELECT * FROM articles ORDER BY date DESC LIMIT 5",$db);
while ($myrow = mysql_fetch_assoc ($result))
{
$arr[$i] = array("date"=>"<table width='100%' border='0' cellspacing='0' cellpadding='8' class='centertable' align='center'>
<tr valign='top'><td colspan='2'> <br /><h2 align='left'><span class='date'>(дата: ".$myrow['date'].")</span>", "title"=>$myrow['title']."</h2>", "img"=>"</td></tr><tr valign='top'><td valign='middle'><img border='0' src='img/articles/".$myrow['img']."' align='center'></td><td><div align='justify'>", "description"=>$myrow['description']."<br /> </div><div align='right'><a href='articles_view.php?id=", "id"=>$myrow['id']."'>читать далее...</a></div></td></tr><tr valign='top'><td colspan='2'> </td></tr></table>");
$i++;
}
$result = mysql_query ("SELECT * FROM milo ORDER BY date DESC LIMIT 5",$db);
while ($myrow = mysql_fetch_assoc ($result))
{
$arr[$i] = array("date"=>"<table width='100%' border='0' cellspacing='0' cellpadding='8' class='centertable' align='center'>
<tr valign='top'><td colspan='2'> <br /><h2 align='left'><span class='date'>(дата: ".$myrow['date'].")</span>", "title"=>$myrow['title']."</h2>", "img"=>"</td></tr><tr valign='top'><td valign='middle'><img border='0' src='img/milo/".$myrow['img']."' align='center'></td><td><div align='justify'>", "description"=>$myrow['description']."<br /> </div><div align='right'><a href='milo_view.php?id=", "id"=>$myrow['id']."'>читать далее...</a></div></td></tr><tr valign='top'><td colspan='2'> </td></tr></table>");
$i++;
}
arsort($arr);
reset($arr);
$quad = 1;
foreach($arr as $key => $type)
{
if ($quad <= 5)
{
$quad++;
foreach($type as $ship)
{
echo("\t$ship\n");
}
}
}
echo("\n");
?>
Спустя 10 минут, 58 секунд (7.01.2010 - 18:55) sergeiss написал(а):
Изварааааааааааааааааааааааааат..................
На самом деле, надо сделать 1 запрос:
И затем 1 цикл вывода данных.
Если общее количество данных - разумное, то выборка будет делаться очень быстро.
PS. Если требуется, то можно к даннму запросу очень легко добавить индикатор того, из какой именно таблицы попала определенная строка.
На самом деле, надо сделать 1 запрос:
SELECT * FROM news
union
SELECT * FROM articles
union
SELECT * FROM milo
ORDER BY date DESC
LIMIT 5
И затем 1 цикл вывода данных.
Если общее количество данных - разумное, то выборка будет делаться очень быстро.
PS. Если требуется, то можно к даннму запросу очень легко добавить индикатор того, из какой именно таблицы попала определенная строка.
Спустя 8 минут, 5 секунд (7.01.2010 - 19:03) inpost написал(а):
А как добавить этот индикатор?
Спасибо за помощь, именно такое я и хотел узнать, интересовался как это сделать... когда не знаешь легкого пути, приходится искать сложные! Но для меня урок, освоил сложности массивов!
Спасибо за помощь, именно такое я и хотел узнать, интересовался как это сделать... когда не знаешь легкого пути, приходится искать сложные! Но для меня урок, освоил сложности массивов!
Спустя 36 минут, 1 секунда (7.01.2010 - 19:39) sergeiss написал(а):
Цитата (inpost @ 7.01.2010 - 20:03) |
Но для меня урок, освоил сложности массивов! |
Мне нравится твой оптимизм
Цитата (inpost @ 7.01.2010 - 20:03) |
А как добавить этот индикатор? |
SELECT *, 'news' as `type` FROM news
union
SELECT *, 'art' FROM articles
union
SELECT *, 'milo' FROM milo
ORDER BY date DESC
LIMIT 5
Имя колонке достаточно дать только в первой выборке, и если надо, то и тип можно задать через CAST.
Можно и цифровой индикатор сделать вместо символьного - это уж как угодно будет.
_____________
Обучаю веб-программированию качественно и не дорого: http://school-php.com
Фрилансер, принимаю заказы: PHP, JS, AS (видео-чаты). Писать в ЛС (Личные сообщения на phpforum).