ОбЪединение результатов нескольких запросов в один массив

Alex_v.tv

Новичок
ОбЪединение результатов нескольких запросов в один массив

Здравствуйте!

Вопрос: как объединить результаты запроса к нескольким несвязаным таблицам одной базы MySQL в один массив?

есть запросы вида:
PHP:
$query1=mysql_query("SELECT * FROM ".$userstable1." WHERE name LIKE '%".$_GET['q']."%'");
   $query2=mysql_query("SELECT * FROM ".$userstable2." WHERE name LIKE '%".$_GET['q']."%'");
   $query3=mysql_query("SELECT * FROM ".$userstable3." WHERE name LIKE '%".$_GET['q']."%'");
   $query4=mysql_query("SELECT * FROM ".$userstable4." WHERE name LIKE '%".$_GET['q']."%'");
попробовал и так и эдак.. не получается :-(
 

Winer

Мимо проходил
каким образом объединить ??? сначала даные из первого, потом из второго,... ???
например array_merge()(php_man);
 

Alex_v.tv

Новичок
Ну да, сначала загнать в массив результат 1 запроса, потом 2 и т.д. и собственно вывести в браузер.

кстати, структуры таблиц абсолютно идентичны... включая названия полей.

щас буду разбираться с тем, что предложили :)

-~{}~ 16.04.04 12:19:

не получается [:-(

ни с UNION, ни с array_merge(), временную таблицу пока не пробовал...

сейчас на работе, не могу описать подробности ошибок, потом сообщу, может кто объяснит неучу...

Просьба такого плана: может есть фрагмент теоретически рабочего кода, которы я мог бы растерзать на предмет "как оно работает"?
Объединение результатов нескольких запросов необходимо для организации постри\аничного вывода результатов поиска.
 

Alex_v.tv

Новичок
пытаюсь сделать нечто вроде:

при попытке вывести кол-во записей в запросе:
PHP:
$query1=mysql_query("SELECT * FROM ".$userstable1." WHERE name LIKE '%".$_GET['q']."%'
   UNION SELECT * FROM ".$userstable2." WHERE name LIKE '%".$_GET['q']."%'
    UNION SELECT * FROM ".$userstable3." WHERE name LIKE '%".$_GET['q']."%'
    UNION SELECT * FROM ".$userstable4." WHERE name LIKE '%".$_GET['q']."%'");
возникает ошибка что-то вроде:

Warning: mysql_num_rows(): supplied argument is not a valid MySQL result resource in /xxx/xxx/WWW/search_.php on line 50
 

Alex_v.tv

Новичок
какбороться? А сам запрос верен?

-~{}~ 16.04.04 17:26:

You have an error in your SQL syntax near 'UNION SELECT * FROM price_office WHERE name LIKE '%монитор%' UNION SELECT *' at line
 

Demiurg

Guest
теперь покажи сам запрос. и скажи, какая у тебя версия mysql.
 

Alex_v.tv

Новичок
$query1=mysql_query("SELECT * FROM ".$userstable1." WHERE name LIKE '%".$_GET['q']."%'
UNION SELECT * FROM ".$userstable2." WHERE name LIKE '%".$_GET['q']."%'
UNION SELECT * FROM ".$userstable3." WHERE name LIKE '%".$_GET['q']."%'
UNION SELECT * FROM ".$userstable4." WHERE name LIKE '%".$_GET['q']."%'");
экспериментирую на провайдере, а он нигде не указывает, какая версия используется. скрипт, это показывающий ненапишу :)

хостинг на h11.ru

-~{}~ 16.04.04 17:54:

версия вроде 3.23.55

извиняюсь за тупость если что...
 

Lav

Guest
UNION is implemented in MySQL 4.0.0.

-~{}~ 16.04.04 17:59:

SELECT VERSION() покажет тебе версию MySQL.
 

Alex_v.tv

Новичок
ага, я сам догадался... :)

как посоветуете поступить?

временную таблицу сотворить?
 

Demiurg

Guest
Alex_v.tv
ты читаешь, что тебе отвечают ?
>union, если версия позволяет.
>TEMPORARY TABLE если не позволяет

винера советаю не слушать.
 

Alex_v.tv

Новичок
Спасибо!

Сотворил такое:
PHP:
$query1 = mysql_query("SELECT * FROM ".$userstable1." WHERE name LIKE '%".$_GET['q']."%'");
$query2 = mysql_query("SELECT * FROM ".$userstable2." WHERE name LIKE '%".$_GET['q']."%'");
$query3 = mysql_query("SELECT * FROM ".$userstable3." WHERE name LIKE '%".$_GET['q']."%'");
$query4 = mysql_query("SELECT * FROM ".$userstable4." WHERE name LIKE '%".$_GET['q']."%'");
   

$create_temp = mysql_db_query($dbName, "CREATE TABLE temp
(n INT( 25 ) NOT NULL,
mem VARCHAR( 25 ) NOT NULL,
name VARCHAR( 250 ) NOT NULL,
cost VARCHAR( 25 ) NOT NULL)");

$row_comp = mysql_num_rows($query1);
$insert_temp_num_comp = mysql_db_query($dbName, "INSERT INTO temp VALUES ('none', 'none', '<b><font color=#009933>Раздел &#168Компьютерная 1&#168&nbsp;&nbsp; Всего найдено:&nbsp;[".$row_comp."]</font></b>','&nbsp;')");

while($row_1 = mysql_fetch_array($query1))
{
$insert_temp = mysql_db_query($dbName, "INSERT INTO temp VALUES ('".$row_1["n"]."', '".$row_1["mem"]."', '".$row_1["name"]."','".$row_1["cost"]."')");	
}
$row_office = mysql_num_rows($query2);
$insert_temp_num_comp = mysql_db_query($dbName, "INSERT INTO temp VALUES ('none', 'none', '<b><font color=#009933>Раздел &#2&#168&nbsp;&nbsp; Всего найдено:&nbsp;[".$row_office."]</font></b>','&nbsp;')");
while($row_2 = mysql_fetch_array($query2))
{
$insert_temp = mysql_db_query($dbName, "INSERT INTO temp VALUES ('".$row_2["n"]."', '".$row_2["mem"]."', '".$row_2["name"]."','".$row_2["cost"]."')");	
}
$row_rasch = mysql_num_rows($query3);
$insert_temp_num_comp = mysql_db_query($dbName, "INSERT INTO temp VALUES ('none', 'none', '<b><font color=#009933>Раздел &#3&#168&nbsp;&nbsp; Всего найдено:&nbsp;[".$row_rasch."]</font></b>','&nbsp;')");
while($row_3 = mysql_fetch_array($query3))
{
$insert_temp = mysql_db_query($dbName, "INSERT INTO temp VALUES ('".$row_3["n"]."', '".$row_3["mem"]."', '".$row_3["name"]."','".$row_3["cost"]."')");	
}
$row_kanz = mysql_num_rows($query4);
$insert_temp_num_comp = mysql_db_query($dbName, "INSERT INTO temp VALUES ('none', 'none', '<b><font color=#009933>Раздел &#1684&#168&nbsp;&nbsp; Всего найдено:&nbsp;[".$row_kanz."]</font></b>','&nbsp;')");
while($row_4 = mysql_fetch_array($query4))
{
$insert_temp = mysql_db_query($dbName, "INSERT INTO temp VALUES ('".$row_4["n"]."', '".$row_4["mem"]."', '".$row_4["name"]."','".$row_4["cost"]."')");	
}

$q_temp_all = mysql_query("SELECT * FROM temp");

$lines_per_page = $str;

$all_lines = mysql_num_rows($q_temp_all);

if (!isset($page) or empty($page) or $page<=0) $page=1;

else $page=(int)$page;

$page_for_query = $page-1;

 $lpos = $page_for_query * $lines_per_page;

		if(!($all_lines=mysql_num_rows($q_temp_all)))
	
   	exit("Ничего не найдено! Повторите поиск, изменив условия запроса.");

		else
		{
echo "<table border=0  width=692 cellspacing=0 cellpadding=0 bgcolor=#cccccc>
<col class=col1><col align=right>
<tr bgcolor=#e1e1e1><td nowrap><b>&nbspНаименование</b><br><hr size=1 color=#9999CC></td><td><b>&nbspЦена, руб</b><br><hr size=1 color=#9999CC></td></tr>";

$query = "SELECT * FROM temp LIMIT $lpos,$lines_per_page";

$result = @mysql_query($query) or die("$query <b>failed!</b><br>".mysql_error());

$count_ = ceil($all_lines / $lines_per_page);

 while ($data_array = mysql_fetch_array($result))
{
$count_++;
echo "<tr";
if ($count_/2==intval($count_/2)) echo " bgcolor=#e1e1e1";
echo " height=20><td>".$data_array['name']."</td><td>".$data_array['cost']."</td></tr>";
 }
echo "</table><br>";

echo "<b>Всего найдено:</b>&nbsp;&nbsp;".$all_lines."<br>";
echo "<b>Вывод на страницу по:</b>&nbsp;&nbsp;".$str."&nbsp;<b>записей</b><br>";
if ($all_lines <= $lines_per_page){
echo "<b>Страница&nbsp;&nbsp;1</b><br>";}
else {
echo "<b>Страницы:</b>&nbsp;&nbsp;";}

$count_pages = ceil($all_lines / $lines_per_page);

if ($count_pages>1) {
 for ($i=1; $i<=$count_pages; $i++) {
   if($page==$i and $i!=1) {echo " | $i";}

   elseif ($page==$i and $i==1) {echo "1";}
   elseif($i==1 and $page!=$i) {echo "<a href=\"$_SERVER[PHP_SELF]?q=$q&group=$group&style=$style&str=$str&page=$i\">$i</a>";}

   elseif($i!=1 and $page!=$i) {echo " | <a href=\"$_SERVER[PHP_SELF]?q=$q&group=$group&style=$style&str=$str&page=$i\">$i</a>";}
 }
}
}

$delete_temp = mysql_db_query($dbName, "DROP TABLE temp");

mysql_close($connect);
}
извиняюсь за длинный код... Мне важно Ваше мнение.

-~{}~ 19.04.04 10:08:

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

Demiurg

Guest
ужас!
во-первых почитай про временные таблицы.
во-вторых почитай про синтаксиси insert ... select ...
в-третих сделай это все в 5 запросов.
в-четвертых объясни, почему не хочешь поставить четверку.
 

rudik

Developer
1. При первой выборке необходимо сразу создать временную таблицу, что-то вроде : CREATE TABLE temp TYPE=HEAP SELECT * FROM ....

2. INSERT INTO temp SELECT ....

Потому как объединение тем способом, которым ты сделал теряет смысл.

-~{}~ 19.04.04 09:30:

О, Demiurg меня опередил с ответом. :)
 

Alex_v.tv

Новичок
Не то, что бы я не хочу... провайдер не хочет... :)

сделаю в пять запросов обязательно, у меня всегда сначала кода в четыре раза больше, чем надо. пока разбераюсь.

огромное, спасибо!

-~{}~ 19.04.04 16:02:

синтаксис изучу, торжественно клянусь!

-~{}~ 19.04.04 16:12:

кстати, ссылку, где можно почитать про временные таблицы, не подкините? может у кого есть в архивах FAQ? Не нашёл ничего удобоваримого...
 
Сверху