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

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

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


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

> Без описания
livote
Отправлено: 21 Июля, 2014 - 14:07:32
Post Id



Частый гость


Покинул форум
Сообщений всего: 243
Дата рег-ции: Авг. 2012  


Помог: 0 раз(а)

[+][+]


Есть рубрики. Они в одной таблице, нужно вытащить количество записей в этих рубриках. Для этого надо делать запрос в другую таблицу. Моя вариант приведённый в цикле, когда каждый раз вытаскивается из бд кажется бредовым.
Как оптимизировать этот код?

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.  


-----
Не следует бояться зайти за пределы того, что считается возможным – ибо именно там находится успех.
 
 Top
Мелкий Супермодератор
Отправлено: 21 Июля, 2014 - 14:11:51
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




В таблице рубрик сделать поле с количеством записей в этой рубрике. Изменять при изменении количества записей (можно триггером).


-----
PostgreSQL DBA
 
 Top
livote
Отправлено: 21 Июля, 2014 - 14:31:44
Post Id



Частый гость


Покинул форум
Сообщений всего: 243
Дата рег-ции: Авг. 2012  


Помог: 0 раз(а)

[+][+]


Мелкий пишет:
В таблице рубрик сделать поле с количеством записей в этой рубрике. Изменять при изменении количества записей (можно триггером).


А вообще как-то можно в подобных ситуациях кол-во обращение к бд снизить? всяко бывает?


-----
Не следует бояться зайти за пределы того, что считается возможным – ибо именно там находится успех.
 
 Top
Мелкий Супермодератор
Отправлено: 21 Июля, 2014 - 14:42:18
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




Как у вас - разумеется, делать нельзя.
Я как про join'а силами приложения, вместо субд, так и подсчёт строк опять же на приложении.

Во-первых, join.
Во-вторых - как правильно считать строки, если сами строки вам не нужны: http://dev[dot]mysql[dot]com/doc/refman/[dot][dot][dot]unting-rows[dot]html


-----
PostgreSQL DBA
 
 Top
livote
Отправлено: 21 Июля, 2014 - 15:05:18
Post Id



Частый гость


Покинул форум
Сообщений всего: 243
Дата рег-ции: Авг. 2012  


Помог: 0 раз(а)

[+][+]


Допустим в цикле не рубрики, а записи. И нужно вытащить рубрику и/или автора. В таблице с записями хранятся id. Как их загрузить в цикл без подобного запроса каждый раз


-----
Не следует бояться зайти за пределы того, что считается возможным – ибо именно там находится успех.
 
 Top
Мелкий Супермодератор
Отправлено: 21 Июля, 2014 - 15:08:16
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




Всё так же джойны. Основная рабочая лошадка всех реляционных баз данных.


-----
PostgreSQL DBA
 
 Top
livote
Отправлено: 21 Июля, 2014 - 15:27:01
Post Id



Частый гость


Покинул форум
Сообщений всего: 243
Дата рег-ции: Авг. 2012  


Помог: 0 раз(а)

[+][+]


Мелкий, а можно на моём примере join показать? Однако


-----
Не следует бояться зайти за пределы того, что считается возможным – ибо именно там находится успех.
 
 Top
Мелкий Супермодератор
Отправлено: 21 Июля, 2014 - 15:35:41
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




Запросто, но вряд ли имеет смысл в качестве примера.
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


-----
PostgreSQL DBA
 
 Top
livote
Отправлено: 21 Июля, 2014 - 16:31:21
Post Id



Частый гость


Покинул форум
Сообщений всего: 243
Дата рег-ции: Авг. 2012  


Помог: 0 раз(а)

[+][+]


Ох я горе-программистер.
Если, например, больше 1 заметки то recordscount всегда = 1, а одно и тоже дублируется
(Добавление)
строки с одним id не объединяются

(Отредактировано автором: 21 Июля, 2014 - 18:03:21)



-----
Не следует бояться зайти за пределы того, что считается возможным – ибо именно там находится успех.
 
 Top
Мелкий Супермодератор
Отправлено: 21 Июля, 2014 - 18:27:09
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




Попробуем полным синтаксисом:
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


-----
PostgreSQL DBA
 
 Top
livote
Отправлено: 21 Июля, 2014 - 18:46:03
Post Id



Частый гость


Покинул форум
Сообщений всего: 243
Дата рег-ции: Авг. 2012  


Помог: 0 раз(а)

[+][+]


Мелкий пишет:
Попробуем полным синтаксисом:
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


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


-----
Не следует бояться зайти за пределы того, что считается возможным – ибо именно там находится успех.
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Вопросы новичков »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB