Можно ли запускать циклы WHILE в MySQL? - PullRequest
1 голос
/ 24 декабря 2009

Можно ли выполнить запрос mysql внутри цикла while, используя идентификатор каждой строки, переданной для получения результатов из другой таблицы? ИЛИ есть ли лучший способ сделать это?

$q = $__FROG_CONN__->query("SELECT cms_page.id, cms_page.title, cms_page.slug, cms_page_part.* FROM cms_page LEFT JOIN cms_page_part ON cms_page_part.page_id=cms_page.id WHERE cms_page.parent_id='8'");
$r = $q->fetchAll(PDO::FETCH_ASSOC);

echo '<ul id="project-list">';
  foreach ($r as $row) { 
    echo '<li>';
    echo '<a href="'.$row["slug"].'.html"><img src="<img src="phpThumb/phpThumb.php?src=public/images/'.$row[0].'/th.jpg&w=162" alt="" /></a>';
    echo '<div class="p-text">';
    echo '<h4>'.$row["location"].'<span>'.$row["project_date"].'</span></h4>';
    echo '<p>'.$row["body"].'</p>';
    echo '</div>';
    echo '</li>';
  }
echo '</ul>';

Я пытаюсь получить поля project_date, body и location из другой таблицы, где совпадает запрос sql. Название и слизняк хранятся в другой таблице. Должно быть не более восьми или около того результатов, но я получаю намного больше.

Ответы [ 6 ]

3 голосов
/ 24 декабря 2009

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

Вместо:

SELECT id FROM users WHERE age <30
SELECT id, x FROM userinfo WHERE userid IN ($id1, $id2, ..., $idn)

сделать:

SELECT users.id, userinfo.x
FROM users
LEFT JOIN userinfo ON userinfo.userid = users.id
WHERE age < 30
1 голос
/ 24 декабря 2009

Чтобы уменьшить накладные расходы на предварительное формирование запроса, вы можете посмотреть, как получить все данные в одном запросе. В этом случае вы можете взглянуть на IN (), например,

SELECT * WHERE x IN (1, 2);

Существует также МЕЖДУ ()

SELECT * WHERE x BETWEEN 1 AND 2;

См. mysql документы для получения дополнительной информации

0 голосов
/ 24 декабря 2009

Это будет очень неэффективно, вам нужно присоединиться к таблицам с идентификатором

SELECT * FROM table1 LEFT JOIN table2 ON (table1.ID = table2.ID) WHERE condition  

Mysql присоединиться к документации

Это вернет один набор строк со всей необходимой информацией, возвращенной из обеих таблиц.

0 голосов
/ 24 декабря 2009

Можно ли выполнить запрос mysql внутри цикла while, используя идентификатор каждой строки, переданной для получения результатов из другой таблицы? ИЛИ есть ли лучший способ сделать это?

Вы должны переформулировать свой запрос в SQL. Скажем, поместите id s в таблицу памяти и используйте его в JOIN:

SELECT  *
FROM    idtable
JOIN    mytable
ON      mytable.id = idtable.id

Таким образом, MySQL сделает петли для вас, но сделает их (обычно) более эффективным способом.

SQL - язык, предназначенный для работы с наборами.

Итак, если у вас есть набор id s и таблица (которая является набором кортежей), ваша первая мысль должна быть: «Как применить операции на основе набора к этим наборам, используя SQL»?

Конечно, можно выполнять несколько простых запросов в цикле, но таким образом вы просто выполняете дополнительную работу, которую разработчики движка SQL, скорее всего, уже сделали для вас (и обычно делали это более эффективно). .

Вы можете прочитать эту статью в моем блоге:

0 голосов
/ 24 декабря 2009

Я бы попытался построить запрос таким образом, чтобы мне нужно было пройти его только один раз. Что-то вроде WHERE ID = 1 ИЛИ ID = 2 ИЛИ ... Передача нескольких запросов и возвращение нескольких наборов записей является дорогостоящей с точки зрения обработки и сетевого трафика.

0 голосов
/ 24 декабря 2009

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

Если вы можете найти альтернативный способ (возможно, см. предложение Якоби ?), В котором вы можете сделать один вызов в базу данных, это, вероятно, лучше.

EDIT

Если вас интересуют только идентификаторы из одной таблицы, чтобы получить правильные результаты из другой таблицы, возможно, JOIN - это то, что вы ищете?

SELECT t1.fieldA, t1.fieldB
FROM table1 t1
JOIN table2 t2 ON t1.ID = t2.ID
WHERE t2.someField = 'someValue'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...