[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Массив
workuspeh
имеется код:

$result = mysql_query("SELECT * FROM test
WHERE expiration_date BETWEEN '
$_POST[expiration_date_ot]'
AND '
$_POST[expiration_date_do]'
ORDER BY expiration_date
ASC;"
);
if(mysql_num_rows($result))
{
while($myrow = mysql_fetch_assoc($result))
{
echo '<tr><td>'.$myrow['id'].'</td></tr>';
}
}

из первой таблицы он берет ID, соответствующее ID есть в другой таблице, где хранятся данные о компаниях и должен вывести телефон, каким образом это сделать? Постараюсь объяснить что имею ввиду
$result = mysql_query("SELECT * FROM test 
WHERE expiration_date BETWEEN '
$_POST[expiration_date_ot]'
AND '
$_POST[expiration_date_do]'
ORDER BY expiration_date
ASC;"
);
if(mysql_num_rows($result))
{
while($myrow = mysql_fetch_assoc($result))
{
$result2 = mysql_query("SELECT * FROM test2 WHERE id=$myrow['id'];");
while($myrow2 = mysql_fetch_assoc($result2))
{
echo '<tr><td>'.$myrow['id'].'</td><td>'.$myrow2['telefon'].'</td></tr>';
}
}
}

Так не работает и как понимаю, будет давать приличную нагрузку, делая столько обращений к базе. Каким образом можно реализовать, то о чем я написал выше?



Спустя 12 минут, 37 секунд (21.05.2012 - 16:43) Renden написал(а):
workuspeh
Да запросы в цикле не есть хорошо, я вижу 2 варианта:
1) Использовать массив т.е в 1 запросе собрать в массив все нужные тебе id-шники, а 2 запросом их выбрать сразу.
2) использовать 1 запрос с LEFT JOIN а потом уже с помощью условий разобрать данные.
Решение:
1)
$array = array();
$result = mysql_query("SELECT * FROM test
WHERE expiration_date BETWEEN '
$_POST[expiration_date_ot]'
AND '
$_POST[expiration_date_do]'
ORDER BY expiration_date
ASC"
);
while($myrow = mysql_fetch_assoc($result))
$array[] = $myrow['id'];

$result2 = mysql_query("SELECT * FROM test2
WHERE id IN("
.implode(",", $array).")");
while($myrow2 = mysql_fetch_assoc($result2))
echo '<tr><td>'.$myrow['id'].'</td><td>'.$myrow2['telefon'].'</td></tr>';


2) что-то типа:

SELECT t1.id,t2.id,t1.expiration_date,t2.telefon
FROM test t1
LEFT JOIN test2 t2 ON t1.id = t2.id
WHERE t1.expiration_date BETWEEN '$_POST[expiration_date_ot]'
AND '$_POST[expiration_date_do]'
ORDER BY t2.expiration_date
ASC

Спустя 1 минута, 23 секунды (21.05.2012 - 16:45) vagrand написал(а):
Правильно писать так:

mysql_query("SELECT * FROM test2 WHERE id=" . $myrow['id']);


что касается нагрузки то собери все $myrow['id'] в массив, например $ids, а потом сделай так:

mysql_query("SELECT * FROM test2 WHERE id in (" . join(',', $ids) . ")");

Спустя 31 минута, 16 секунд (21.05.2012 - 17:16) Kuliev написал(а):
workuspeh
Используйте подзапрос

SELECT *
FROM `test2` AS `t2`
WHERE `t2`.`id` IN (SELECT `t1`.`id` FROM `test1` AS `t1`);

Спустя 16 часов, 2 минуты, 21 секунда (22.05.2012 - 09:18) workuspeh написал(а):
сделал через LEFT JOIN, в двух разных таблицах (test1 и test2) записи пересекаются при помощи разных колонок у первой таблицы (test1) idcomp, у второй (test2) id, т.е. id=idcomp, у первой таблицы (test1) есть так же поле id, которое не равно id второй таблицы (test2)

при выводе результатов в массиве, переменная $myrow['id'] берет id второй таблицы, необходимо, чтобы брало значение первой таблицы, пробовал писать $myrow['test1.id'] не работает, подскажите каким образом вывести id первой таблицы

Спустя 1 минута, 53 секунды (22.05.2012 - 09:20) Игорь_Vasinsky написал(а):
вместо mysql_fetch_assoc - используй mysql_fetch_array - увидишь все ячейки

Спустя 28 минут, 24 секунды (22.05.2012 - 09:49) Kuliev написал(а):
workuspeh
Попробуй так:

$sql = "SELECT * FROM `test2` AS `t2`
WHERE `t2`.`id` IN (SELECT `id` FROM `test`
WHERE `expiration_date` BETWEEN '"
.$_POST['expiration_date_ot']."'
AND '"
. $_POST['expiration_date_do'] ."')";

$res = mysql_query($sql) or die(mysql_error() .'<br>'. $sql);

if(mysql_num_rows($res) > 0)
{
while($row = mysql_fetch_assoc($res))
{
echo "<tr>\n";
echo "<td>". $row['id'] ."</td>\n";
echo "<td>". $row['telefon'] ."</td>\n";
echo "</tr>\n";
}
}


Спустя 1 час, 19 минут, 40 секунд (22.05.2012 - 11:08) workuspeh написал(а):
Цитата (Игорь_Vasinsky @ 22.05.2012 - 05:20)
вместо mysql_fetch_assoc - используй mysql_fetch_array - увидишь все ячейки

можно подробнее? Как увидеть все ячейки?

Kuliev, к сожалению так не получилось, не совсем разобрался с вашей конструкцией

Спустя 10 минут, 46 секунд (22.05.2012 - 11:19) Kuliev написал(а):
workuspeh
Что конкретней не получилось, может какие то ошибки выскочили? Имена полей таблиц проверяли или тупо код скопировали?

Спустя 3 минуты, 36 секунд (22.05.2012 - 11:23) Игорь_Vasinsky написал(а):
$sql = "SELECT * FROM `test2` AS `t2`
WHERE `t2`.`id` IN (SELECT `id` FROM `test`
WHERE `expiration_date` BETWEEN '"
.$_POST['expiration_date_ot']."'
AND '"
. $_POST['expiration_date_do'] ."')";

$res = mysql_query($sql) or die(mysql_error() .'<br>'. $sql);

if(mysql_num_rows($res) > 0)
{
while($row = mysql_fetch_array($res))
{
echo '<pre>' . print_r($row, 1) . '</pre>';
}
}

Спустя 3 минуты, 20 секунд (22.05.2012 - 11:26) workuspeh написал(а):
Цитата (Kuliev @ 22.05.2012 - 07:19)
или тупо код скопировали?

имена полей менял под свои, не понял, что означает t2, структуру самого подзапроса

в итоге получилось:

$result=mysql_query("SELECT `test1`.*, `test2`.*, `test1`.`id` AS `idorg`
FROM `test1`
LEFT JOIN `test2` ON test1.ad_companyid=company.id
WHERE expiration_date BETWEEN '
$_POST[expiration_date_ot]' AND '$_POST[expiration_date_do]'
ORDER BY expiration_date
ASC;"
);


и id первой таблицы вывожу:
$myrow['idorg']

Спустя 1 час, 2 минуты, 23 секунды (22.05.2012 - 12:29) Kuliev написал(а):
workuspeh
Скопируй запрос и помести в phpMyAdmin подставь свои даты и посмотри результат запроса!


_____________
только начинаю изучать php
Быстрый ответ:

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