[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Выборка из двух таблиц
inpost
Короткое описание: существует 3 таблицы с одинаковым строением, разное содержание.
Таблицы: 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 написал(а):
в каждой таблице есть поле дата...
У меня родилась идея, сделать через многомерный массив, только очень сложно разобраться, как с ним работать, ни разу не пробовал их создавать, поэтому застрял...

$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

А зачем изначально делать геморрой на свою.... голову smile.gif?
Почему бы не сделат одну таблицу, в которой добавить еще одно поле для идентификации типа содержимого: 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 написал(а):
Изварааааааааааааааааааааааааат.................. smile.gif

На самом деле, надо сделать 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 написал(а):
А как добавить этот индикатор?
Спасибо за помощь, именно такое я и хотел узнать, интересовался как это сделать... когда не знаешь легкого пути, приходится искать сложные! smile.gif Но для меня урок, освоил сложности массивов! smile.gif

Спустя 36 минут, 1 секунда (7.01.2010 - 19:39) sergeiss написал(а):
Цитата (inpost @ 7.01.2010 - 20:03)
Но для меня урок, освоил сложности массивов!

Мне нравится твой оптимизм smile.gif

Цитата (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).
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.