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

Форум MySQL

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

 

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

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

тема: выборка из двух несвязанных таблиц по дате
 
 автор: franko   (12.03.2011 в 23:08)   письмо автору
 
 

необходимо сделать выборку из двух таблиц, но дело в том, что нет ни одного общего столбца

$result = mysql_query ("SELECT id, title, date FROM table1 
WHERE table1.date, table2.date>'$date_begin' AND table1.date,  table2.date < '$date_end' ORDER by table1.date,  table2.date DESC", $db);

   
 
 автор: cheops   (12.03.2011 в 23:41)   письмо автору
 
   для: franko   (12.03.2011 в 23:08)
 

А что сделать хотите? Почему нельзя просто выполнить два запроса?

   
 
 автор: franko   (12.03.2011 в 23:54)   письмо автору
 
   для: cheops   (12.03.2011 в 23:41)
 

http://11klassniki.ru/index.php справа есть АРХИВ НОМЕРОВ.

там я хочу вывести статьи из двух таблиц "Новые статьи" и "Про ЕГЭ"

поэтому делаю общий запрос

   
 
 автор: cheops   (13.03.2011 в 00:03)   письмо автору
 
   для: franko   (12.03.2011 в 23:54)
 

Т.е. они никак не связаны? Наверное будет удобнее осуществить два отдельных запроса или, если у них одинаковая структура, не объединить эти таблицы при помощи оператора UNION
SELECT id, title, date FROM table1
UNION
SELECT id, title, date FROM table2

   
 
 автор: franko   (13.03.2011 в 00:19)   письмо автору
 
   для: cheops   (13.03.2011 в 00:03)
 

хорошо. а как быть

if (mysql_num_rows($result) > 0)
{
$myrow = mysql_fetch_array($result);
do
{
printf ("<a href='view_post.php?id=%s'>


есть view_post.php и view_post_ege.php

   
 
 автор: cheops   (13.03.2011 в 00:21)   письмо автору
 
   для: franko   (13.03.2011 в 00:19)
 

>есть view_post.php и view_post_ege.php
Чем они отличаются и какую несут ответственность? Они выводят списки ссылок из разных таблиц или здесь дело в чем-то другом?

   
 
 автор: franko   (13.03.2011 в 00:24)   письмо автору
 
   для: cheops   (13.03.2011 в 00:21)
 

view_post.php отражает данные из одной табл.

а view_post_ege.php - из другой

Они выводят списки ссылок из разных таблиц

   
 
 автор: cheops   (13.03.2011 в 01:10)   письмо автору
 
   для: franko   (13.03.2011 в 00:24)
 

Хм... т.е. и запросы находятся в этих файлах? Тогда не понимаю, почему нужно эти запросы объединять? Помоему наоборот их удобно выполнять раздельно (даже сопровождать будет удобнее при меньшем количестве связей)?

   
 
 автор: franko   (13.03.2011 в 10:21)   письмо автору
 
   для: cheops   (13.03.2011 в 01:10)
 

если сделать два запроса, тогда

$result = mysql_query ("SELECT id, title, date FROM table1  
WHERE date>'$date_begin' AND date < '$date_end' ORDER by date DESC", $db);

$result = mysql_query ("SELECT id, title, date FROM table2  
WHERE date>'$date_begin' AND date < '$date_end' ORDER by date DESC", $db);


это работает, естественно.
но вопрос в том чтобы выводить по ДАТЕ эти статьи из двух таблиц. а сейчас получается, что в начале выводятся статьи из TABLE 1, а потом из TABLE2

   
 
 автор: cheops   (13.03.2011 в 11:46)   письмо автору
 
   для: franko   (13.03.2011 в 10:21)
 

Ясно, тогда вам должен подойти UNION
SELECT id, title, date FROM table1   
WHERE date>'$date_begin' AND date < '$date_end'
UNION
SELECT id, title, date FROM table2   
WHERE date>'$date_begin' AND date < '$date_end'
ORDER by date DESC

PS Вместо view_post.php и view_post_ege.php создавайте один файл с одним обработчиком запроса.

   
 
 автор: franko   (13.03.2011 в 13:37)   письмо автору
 
   для: cheops   (13.03.2011 в 11:46)
 

вот создал http://11klassniki.ru/view_year.php?id=150

проблема в том что если верхние ссылки соответствуют содержимому, то нижние ссылки выводят неверный текст

$result = mysql_query("SELECT DATE_FORMAT(date,'%d.%m.%Y') AS date, title, text, cat from table1 WHERE id='$id'
            UNION
            SELECT DATE_FORMAT(date,'%d.%m.%Y') AS date, title, text, ege from table2 WHERE id='$id'", $db);

   
 
 автор: cheops   (13.03.2011 в 14:04)   письмо автору
 
   для: franko   (13.03.2011 в 13:37)
 

>вот создал http://11klassniki.ru/view_year.php?id=150
Куда смотреть?

>проблема в том что если верхние ссылки соответствуют содержимому, то нижние ссылки >выводят неверный текст
Имейте в виду, что столбца ege не будет, его значения будут находиться в cat, при UNION-объединении столбцы называются по именам первой таблицы.

   
 
 автор: franko   (13.03.2011 в 16:10)   письмо автору
 
   для: cheops   (13.03.2011 в 14:04)
 

вернее лучше смотреть сюда http://11klassniki.ru/view_date.php?date=2011-

Имейте в виду, что столбца ege не будет, его значения будут находиться в cat, при UNION-объединении столбцы называются по именам первой таблицы.

так ege нет в первой таблице, как нет cat во второй

   
 
 автор: cheops   (13.03.2011 в 16:37)   письмо автору
 
   для: franko   (13.03.2011 в 16:10)
 

Имеется в виду, что при объединении будет только столбец cat, в котором будут значения из ege.

   
 
 автор: franko   (13.03.2011 в 16:51)   письмо автору
 
   для: cheops   (13.03.2011 в 16:37)
 

тогда получается нужно создавать еще одну общую переменную вместо cat и ege? Иначе идет путаница. вместо ege подставляется cat и выводится другая статья

   
 
 автор: cheops   (13.03.2011 в 18:26)   письмо автору
 
   для: franko   (13.03.2011 в 16:51)
 

Да, если от этого зависит логика вывода, нужно вводить еще статический столбец, с признаком, из какой таблицы берутся данные
SELECT DATE_FORMAT(date,'%d.%m.%Y') AS date, title, text, cat, 'fst' AS tbl
from table1
WHERE id='$id' 
UNION 
SELECT DATE_FORMAT(date,'%d.%m.%Y') AS date, title, text, ege, 'snd'
from table2
WHERE id='$id'

   
 
 автор: franko   (13.03.2011 в 19:41)   письмо автору
 
   для: cheops   (13.03.2011 в 18:26)
 

какой тип данных нужно присвить столбцам fst' и 'snd'

   
 
 автор: cheops   (13.03.2011 в 19:47)   письмо автору
 
   для: franko   (13.03.2011 в 19:41)
 

А их вообще создавать не нужно, просто добавьте строки в SELECT-запрос (как это показано выше) и у вас будет динамический столбец, который в реальных таблицах не существует, но в результирующей таблице он будет присутствовать.

   
 
 автор: franko   (13.03.2011 в 21:52)   письмо автору
 
   для: cheops   (13.03.2011 в 19:47)
 

добавил как написали.

если взглянуть на http://11klassniki.ru/view_date.php?date=2011- то только две нижние ссылки не верно ссылаются.

   
 
 автор: franko   (13.03.2011 в 22:01)   письмо автору
 
   для: franko   (13.03.2011 в 21:52)
 

SELECT DATE_FORMAT(date,'%d.%m.%Y') AS date, title, text, cat, 'fst' AS tbl
from table1

'fst' AS tbl или 'fst' AS table1

   
 
 автор: cheops   (13.03.2011 в 22:15)   письмо автору
 
   для: franko   (13.03.2011 в 22:01)
 

Это просто название столбца, чтобы было потом удобнее ссылаться из результирующего массива - можно любое, кроме уже занятых, подставить.

   
 
 автор: franko   (13.03.2011 в 22:23)   письмо автору
 
   для: cheops   (13.03.2011 в 22:15)
 

но работает не верно.

   
 
 автор: cheops   (13.03.2011 в 22:31)   письмо автору
 
   для: franko   (13.03.2011 в 22:23)
 

А как нужно чтобы ссылалось? Мне логика скрипта не видна, так как у меня этого скрипта нет. По идеи основываясь на этом последнем столбце вы должны принимать решение как выводить данные из той или иной таблицы. Вы как это делаете?

   
 
 автор: franko   (13.03.2011 в 23:02)   письмо автору
 
   для: cheops   (13.03.2011 в 22:31)
 

здесь мы выводим ссылки
$result = mysql_query("SELECT id, title, date  FROM table1 WHERE date >'$date_begin' AND date < '$date_end' 
     UNION
    SELECT id, title, date  FROM table2 WHERE date >'$date_begin' AND date < '$date_end'
     ORDER by date DESC", $db);

printf ("<div class='content3'><a href='view_year.php?id=%s'>


файл 'view_year.php
а здесь выводим страницы
$result = mysql_query("SELECT DATE_FORMAT(date,'%d.%m.%Y') AS date, title, cat, 'fst' AS tbl from table1 WHERE id='$id'
    UNION
    SELECT DATE_FORMAT(date,'%d.%m.%Y') AS date, title, ege, 'snd' from table2 WHERE id='$id'", $db);

   
 
 автор: cheops   (13.03.2011 в 23:16)   письмо автору
 
   для: franko   (13.03.2011 в 23:02)
 

>здесь мы выводим ссылки
Вот как раз тут и нужно бы флаг-признак поставить
$result = mysql_query("SELECT id, title, date, 'fst' AS tbl FROM table1 WHERE date >'$date_begin' AND date < '$date_end'  
     UNION 
    SELECT id, title, date, 'snd'  FROM table2 WHERE date >'$date_begin' AND date < '$date_end' 
     ORDER by date DESC", $db);

И передать его через GET-параметр
printf ("<div class='content3'><a href='view_year.php?id=%s&amp;tbl=%s'>
А в файле 'view_year.php уже не осуществлять запрос к двум таблицам, а к конкретной, которая будет определяться вторым GET-параметром tbl
<?php
  
if($_GET['tbl'] == "fst"$table "table1";
  else 
$table "table2";
  ...
  
$query "SELECT DATE_FORMAT(date,'%d.%m.%Y') AS date, title, cat
                  from 
$table WHERE id='$id';
  
$result = mysql_query();
?>

   
 
 автор: franko   (14.03.2011 в 00:13)   письмо автору
 
   для: cheops   (13.03.2011 в 23:16)
 

'view_year.php?id=%s&amp;tbl=%s' - здесь все верно?

   
 
 автор: cheops   (14.03.2011 в 12:48)   письмо автору
 
   для: franko   (14.03.2011 в 00:13)
 

Да, нужно передать два параметр - id и tbl. Соотстветственно у printf() тоже будет два параметра. Символ амперсанда & всегда лучше записыать в HTML-нотации &amp; - сильно себе съэкономите времени в дальнейшем, при работе с RSS/XML или если потребуется создать валидный XHTML.

   
 
 автор: franko   (14.03.2011 в 17:25)   письмо автору
 
   для: franko   (14.03.2011 в 00:13)
 

так ошибку дает.

   
 
 автор: cheops   (14.03.2011 в 20:14)   письмо автору
 
   для: franko   (14.03.2011 в 17:25)
 

1) Как выглядит сообщение об ошибке?
2) Как выглядит вызов функции sprintf() от первого символа до последнего ;?

   
 
 автор: franko   (15.03.2011 в 11:31)   письмо автору
 
   для: cheops   (14.03.2011 в 20:14)
 

БЫЛО:
{
printf ("<div class='content3'><a href='view_year.php?id=%s'><p>%s</p></a>
", $myrow["id"], $myrow["title"]);
}

ПРЕДЛАГАЕТСЯ:
{
printf ("<div class='content3'><a href='view_year.php?id=%s&amp;tbl=%s'><p>%s</p></a>
", $myrow["id"], $myrow["title"]);
}

ОШИБКА:
Warning: printf() [function.printf]: Too few arguments in ..view_date.php on line 90

Что добавить в строку ", $myrow["id"], ... $myrow["title"]);

   
 
 автор: cheops   (15.03.2011 в 11:38)   письмо автору
 
   для: franko   (15.03.2011 в 11:31)
 

Вам теперь три аргумента передавать нужно

printf ("<div class='content3'><a href='view_year.php?id=%s&amp;tbl=%s'><p>%s</p></a>",
$myrow["id"], $myrow["tbl"], $myrow["title"]); 
}

   
 
 автор: franko   (15.03.2011 в 12:28)   письмо автору
 
   для: cheops   (15.03.2011 в 11:38)
 

теперь файл /view_year.php
  if($_GET['tbl'] == "fst") $table = "table1"; 
  else $table = "table2"; 

$result = mysql_query("SELECT DATE_FORMAT(date,'%d.%m.%Y') AS date, title, cat  from $tabl WHERE id='$id'", $db);


You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'WHERE id='151'' at line 1

   
 
 автор: cheops   (15.03.2011 в 12:47)   письмо автору
 
   для: franko   (15.03.2011 в 12:28)
 

Вместо $tabl в SQL-запросе нужно написать $table.

   
 
 автор: franko   (15.03.2011 в 12:54)   письмо автору
 
   для: cheops   (15.03.2011 в 12:47)
 

теперь
Unknown column 'cat' in 'field list'
видимо в table2 cat отсутствует

   
 
 автор: cheops   (15.03.2011 в 13:03)   письмо автору
 
   для: franko   (15.03.2011 в 12:54)
 

А столбец cat в обеих таблицах присутствует?

   
 
 автор: franko   (15.03.2011 в 13:08)   письмо автору
 
   для: cheops   (15.03.2011 в 13:03)
 

только в одной таблице саt
a в другой table - ege

   
 
 автор: cheops   (15.03.2011 в 13:11)   письмо автору
 
   для: franko   (15.03.2011 в 13:08)
 

Тогда лучше переделать код следующим образом
<?php
  
...
  if(
$_GET['tbl'] == "fst")
  {
    
$query "SELECT DATE_FORMAT(date,'%d.%m.%Y') AS date, title, cat
                  FROM table1 WHERE id='
$id'"
  
}
  else
  {
    
$query "SELECT DATE_FORMAT(date,'%d.%m.%Y') AS date, title, ege AS cat
                  FROM table2 WHERE id='
$id'"
  
}
  
$result mysql_query($query$db); 
  ...
?>

   
 
 автор: franko   (15.03.2011 в 13:26)   письмо автору
 
   для: cheops   (15.03.2011 в 13:11)
 

if($_GET['tbl'] == "fst") 
{
$query = "SELECT DATE_FORMAT(date,'%d.%m.%Y') AS date, title, cat  from table1 WHERE id='$id'"
}
else
{
$query = "SELECT DATE_FORMAT(date,'%d.%m.%Y') AS date, title, ege AS cat  from table2 WHERE id='$id'"
}
$result = mysql_query($query, $db); 
if (!$result)


Parse error: syntax error, unexpected '}' in ...view_year.php on line 6

   
 
 автор: cheops   (15.03.2011 в 13:27)   письмо автору
 
   для: franko   (15.03.2011 в 13:26)
 

Есть такое дело, точки с запятой забыл.
if($_GET['tbl'] == "fst")  

$query = "SELECT DATE_FORMAT(date,'%d.%m.%Y') AS date, title, cat  from table1 WHERE id='$id'";

else 

$query = "SELECT DATE_FORMAT(date,'%d.%m.%Y') AS date, title, ege AS cat  from table2 WHERE id='$id'";

$result = mysql_query($query, $db);  
if (!$result)

   
 
 автор: franko   (15.03.2011 в 13:34)   письмо автору
 
   для: cheops   (15.03.2011 в 13:27)
 

Работает! Спасибо.
в заключение. раньше было защита.
if (isset ($_GET['id'])) {$id = $_GET['id'];}
if (!isset($id)) {$id=1;}
/* Проверяем, является ли переменная числом */
if (!preg_match("|^[\d]+$|", $id)) {
exit ("<p>Неверный формат запроса! Проверьте URL!");

теперь как написать для
id=149&tbl=snd

   
 
 автор: cheops   (15.03.2011 в 13:44)   письмо автору
 
   для: franko   (15.03.2011 в 13:34)
 

Можно оставить без изменений, так как у нас GET-параметр tbl сравнивается со строкой в операторе if, т.е. даже если будет введено что-то другое, логика не пострадает и ошибок это не вызовет.

   
 
 автор: franko   (15.03.2011 в 22:19)   письмо автору
 
   для: cheops   (15.03.2011 в 13:44)
 

я имел ввиду как защитить сайт, если кто-то захочет в tbl прописать какой-нибудь код или команду

   
 
 автор: cheops   (15.03.2011 в 22:26)   письмо автору
 
   для: franko   (15.03.2011 в 22:19)
 

Это команда никогда не будет выполнена. Все, что будет введено сравниться со строкой "fst" и после того, как не будет найдено соответствия будет выполняться код в else.

   
 
 автор: franko   (16.03.2011 в 00:42)   письмо автору
 
   для: cheops   (15.03.2011 в 22:26)
 

Спасибо cheops.
Тема можно закрывать

   
Rambler's Top100
вверх

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