$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)
2) что-то типа:
Да запросы в цикле не есть хорошо, я вижу 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 написал(а):
Правильно писать так:
что касается нагрузки то собери все $myrow['id'] в массив, например $ids, а потом сделай так:
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 первой таблицы
при выводе результатов в массиве, переменная $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 подставь свои даты и посмотри результат запроса!
Скопируй запрос и помести в phpMyAdmin подставь свои даты и посмотри результат запроса!
_____________
только начинаю изучать php