Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: Как вытащить данные из другой таблицы в цикле
Форумы портала PHP.SU » » Вопросы новичков » Как вытащить данные из другой таблицы в цикле

Страниц (1): [1]
 

1. livote - 21 Июля, 2014 - 14:07:32 - перейти к сообщению
Есть рубрики. Они в одной таблице, нужно вытащить количество записей в этих рубриках. Для этого надо делать запрос в другую таблицу. Моя вариант приведённый в цикле, когда каждый раз вытаскивается из бд кажется бредовым.
Как оптимизировать этот код?

PHP:
скопировать код в буфер обмена
  1.  
  2. <?
  3. $resLastWrite = mysql_query("SELECT * FROM category ORDER BY name");
  4. if (mysql_num_rows($resLastWrite)>0) {
  5. echo "<ul>";
  6. while ($myLastWrite = mysql_fetch_array($resLastWrite))
  7. {
  8. $myWrite = $myLastWrite[id];
  9. $resNumLast = mysql_query("SELECT id FROM allnot WHERE category = $myWrite");
  10. $numWrite = mysql_num_rows($resNumLast);
  11. printf("                                                <li><a href='/category.php?url=%s'>%s ($numWrite)</a></li>
  12. ", $myLastWrite[url], $myLastWrite[name]);
  13. }
  14. echo "</ul>";
  15. }
  16. ?>
  17.  
2. Мелкий - 21 Июля, 2014 - 14:11:51 - перейти к сообщению
В таблице рубрик сделать поле с количеством записей в этой рубрике. Изменять при изменении количества записей (можно триггером).
3. livote - 21 Июля, 2014 - 14:31:44 - перейти к сообщению
Мелкий пишет:
В таблице рубрик сделать поле с количеством записей в этой рубрике. Изменять при изменении количества записей (можно триггером).


А вообще как-то можно в подобных ситуациях кол-во обращение к бд снизить? всяко бывает?
4. Мелкий - 21 Июля, 2014 - 14:42:18 - перейти к сообщению
Как у вас - разумеется, делать нельзя.
Я как про join'а силами приложения, вместо субд, так и подсчёт строк опять же на приложении.

Во-первых, join.
Во-вторых - как правильно считать строки, если сами строки вам не нужны: http://dev[dot]mysql[dot]com/doc/refman/[dot][dot][dot]unting-rows[dot]html
5. livote - 21 Июля, 2014 - 15:05:18 - перейти к сообщению
Допустим в цикле не рубрики, а записи. И нужно вытащить рубрику и/или автора. В таблице с записями хранятся id. Как их загрузить в цикл без подобного запроса каждый раз
6. Мелкий - 21 Июля, 2014 - 15:08:16 - перейти к сообщению
Всё так же джойны. Основная рабочая лошадка всех реляционных баз данных.
7. livote - 21 Июля, 2014 - 15:27:01 - перейти к сообщению
Мелкий, а можно на моём примере join показать? Однако
8. Мелкий - 21 Июля, 2014 - 15:35:41 - перейти к сообщению
Запросто, но вряд ли имеет смысл в качестве примера.
CODE (SQL):
скопировать код в буфер обмена
  1. SELECT id, url, name, ifnull(recordscount,0) AS recordscount FROM category LEFT JOIN (
  2. SELECT category AS id, count(0) AS recordscount FROM allnot GROUP BY id
  3. ) categorycount USING(id) ORDER BY name


Если не нужны строки с 0 записей, то будет пара упрощений:
CODE (SQL):
скопировать код в буфер обмена
  1. SELECT id, url, name, recordscount FROM category JOIN (
  2. SELECT category AS id, count(0) AS recordscount FROM allnot GROUP BY id
  3. ) categorycount USING(id) ORDER BY name
9. livote - 21 Июля, 2014 - 16:31:21 - перейти к сообщению
Ох я горе-программистер.
Если, например, больше 1 заметки то recordscount всегда = 1, а одно и тоже дублируется
(Добавление)
строки с одним id не объединяются
10. Мелкий - 21 Июля, 2014 - 18:27:09 - перейти к сообщению
Попробуем полным синтаксисом:
CODE (SQL):
скопировать код в буфер обмена
  1. SELECT id, url, name, ifnull(recordscount,0) AS recordscount FROM category LEFT JOIN (
  2. SELECT category, count(0) AS recordscount FROM allnot GROUP BY category
  3. ) categorycount ON category.id=category ORDER BY name
11. livote - 21 Июля, 2014 - 18:46:03 - перейти к сообщению
Мелкий пишет:
Попробуем полным синтаксисом:
CODE (SQL):
скопировать код в буфер обмена
  1. SELECT id, url, name, ifnull(recordscount,0) AS recordscount FROM category LEFT JOIN (
  2. SELECT category, count(0) AS recordscount FROM allnot GROUP BY category
  3. ) categorycount ON category.id=category ORDER BY name


О! Благодарю!

 

Powered by ExBB FM 1.0 RC1