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]   

> Без описания
usemind
Отправлено: 15 Октября, 2014 - 22:24:50
Post Id


Новичок


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


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




Здравствуйте.
Делаю выборку из БД с несколькими значениями.
Есть материал в Joomla, например его ID = 400. Мне нужно выбрать все материалы, которые ниже 400 (т.е. 399, 398...) и лежат в catid с несколькими значениями, а также показать их как мне нужно... catid у каждого материала свой и не дублируется.
т.е. например, материал с id 400 имеет catid 1, но нет его в 2 или 3...


PHP:
скопировать код в буфер обмена
  1. $id = 400; //например ID 400
  2. //ON while
  3. $i = 0;
  4. while ( $i <= 10){
  5.  
  6. //подкл к базе и выборка
  7. $db     = JFactory::getDBO();
  8. $query = 'SELECT * FROM #__content WHERE state=1 AND id = "'.$id.'" AND catid IN (1, 2, 3) ORDER BY id ASC';
  9. $db->setQuery($query);
  10. $rows = $db->loadObjectList();
  11.  
  12.  
  13. //тут выводим инфу...
  14.  
  15.  
  16. $i++; //увеличивает счетчик на 1
  17. $id--; //уменьшаем ID на 1
  18. }
  19. //OFF while


У меня все работает, но выборка идет не так как хочется, а именно выводятся материалы с одним и тем же ID несколько раз, хотя в БД все прописано правильно и запрос тоже правильный.
Так вот. как проверить цикл, чтобы он не выводил повторяющиеся ID несколько раз?

Да, еще хотелось бы добавить, что ID, принадлежащие конкретной catid могут идти не подряд, например id материала 400, а предыдущий - 387...

(Отредактировано автором: 16 Октября, 2014 - 19:33:32)

 
 Top
melomaniac
Отправлено: 17 Октября, 2014 - 14:38:44
Post Id



Новичок


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


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




DISTINCT ?
 
 Top
usemind
Отправлено: 17 Октября, 2014 - 15:08:58
Post Id


Новичок


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


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




melomaniac пишет:
DISTINCT ?

Попробовал - не помогло.
У меня получается так.
Например ID последнего материала 400. Мне нужно вывести материалы, у которых ID меньше 400, но принадлежат они к категории (catid) 1, например.
Т.е. получается у меня как-то не так написан сам цикл.
По логике, если последний ID 400, то предыдущий ID этой категории должен быть 399, но у этого 399 может быть другая категория, поэтому мне выводит содержимое с ID 400.
Т.е. мне надо как-то иначе узнавать, например, предыдущие 10 ID из категории 1, но как это сделать я не знаю.
Например, у последнего ID 400, а мне нужно вывести 10 предыдущих, а ID у них могут быть 397, 390, 350 и т.п.
Короче уже запутано получается. Подскажите как узнать сколько записей (и как их записать в цикле) в базе есть с категорией 1, ID которых меньше 400?

___
Я частично решил проблему, но криво. Поставил проверку на принадлежность категории 1, но если материалы имеют ID 250, а последний - 400, то мне выведется только 1 материал и то не факт, в зависимости от того, сколько итераций цикла выставил *(

(Отредактировано автором: 17 Октября, 2014 - 15:11:56)

 
 Top
melomaniac
Отправлено: 17 Октября, 2014 - 16:08:59
Post Id



Новичок


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


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




А если для начала цикл убрать ? Т.е. сделать так:
CODE (SQL):
скопировать код в буфер обмена
  1.  
  2. 'SELECT * FROM #__content WHERE state=1 AND id < 400(к примеру) AND catid IN (1, 2, 3) ORDER BY id ASC'
  3.  


По идеи это должно выбрать все записи, до id = 400 в данном случае.
 
 Top
usemind
Отправлено: 17 Октября, 2014 - 16:58:36
Post Id


Новичок


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


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




Попробую...
(Добавление)
Дело в том, что эффект тот же, что и при проверке принадлежания к конкретной категории. Получается у меня само условие цикла не правильно.
$i = 0;
while ($i <= 10){
...
$i++;
}
в этом случае, как ни крути, цикл делается только 10 раз и если категория не 1, то ничего не выводится.
Т.е. если ID 399 не принадлежит категории 1, то цикл пропускает его, переходит к следующему ID 398, который принадлежит, например 1, выводит её, затем снова $i увеличивается, а $id уменьшается на 1..
Попробую сделать проверку для цикла Оо. пц эта логика жестокая штука)))
Попробовал - фигня...

(Отредактировано автором: 17 Октября, 2014 - 17:53:22)

 
 Top
melomaniac
Отправлено: 17 Октября, 2014 - 18:24:22
Post Id



Новичок


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


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




usemind пишет:
Попробую...
(Добавление)
Дело в том, что эффект тот же, что и при проверке принадлежания к конкретной категории. Получается у меня само условие цикла не правильно.
$i = 0;
while ($i <= 10){
...
$i++;
}
в этом случае, как ни крути, цикл делается только 10 раз и если категория не 1, то ничего не выводится.
Т.е. если ID 399 не принадлежит категории 1, то цикл пропускает его, переходит к следующему ID 398, который принадлежит, например 1, выводит её, затем снова $i увеличивается, а $id уменьшается на 1..
Попробую сделать проверку для цикла Оо. пц эта логика жестокая штука)))
Попробовал - фигня...


Вы сделали так:

PHP:
скопировать код в буфер обмена
  1.  
  2.  
  3. $id = 400; //например ID 400
  4.  
  5.  
  6. 2.//ON while
  7.  
  8.  
  9. 3.$i = 0;
  10.  
  11.  
  12. 4.while ( $i <= 10){
  13.  
  14.  
  15. 5.
  16.  
  17.  
  18. 6.//подкл к базе и выборка
  19.  
  20.  
  21. 7.$db     = JFactory::getDBO();
  22.  
  23.  
  24. 8.$query = 'SELECT * FROM #__content WHERE state=1 AND id < $id AND catid IN (1, 2, 3) ORDER BY id ASC';
  25.  
  26.  
  27. 9.$db->setQuery($query);
  28.  
  29.  
  30. 10.$rows = $db->loadObjectList();
  31.  
  32.  
  33. 11.
  34.  
  35.  
  36. 12.
  37.  
  38.  
  39. 13.//тут выводим инфу...
  40.  
  41.  
  42. 14.
  43.  
  44.  
  45. 15.
  46.  
  47.  
  48. 16.$i++; //увеличивает счетчик на 1
  49.  
  50.  
  51. 17.$id--; //уменьшаем ID на 1
  52.  
  53.  
  54. 18.}
  55.  
  56.  
  57. 19.//OFF while
  58.  

или все же так:
PHP:
скопировать код в буфер обмена
  1.  
  2. $db = JFactory::getDBO();
  3. $query = 'SELECT * FROM #__content WHERE state=1 AND id < $id AND catid IN (1, 2, 3) ORDER BY id ASC';
  4. $db->setQuery($query);
  5. $rows = $db->loadObjectList();
  6.  

Цикл убрали ?

(Отредактировано автором: 17 Октября, 2014 - 18:25:03)

 
 Top
usemind
Отправлено: 17 Октября, 2014 - 19:24:25
Post Id


Новичок


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


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




Да, как Вы указываете работает все четко. Материал выводится только один - вот в чем беда.
В том то и дело, что мне нужно сразу подгружать ну хотя бы 3-10...
Т.е. тут без цикла никак... А если цикл, то уменьшая ID на 1 я ничего не добиваюсь... Вот и головоломка как узнать 10 ID предыдущих от 400-того, у которых категория == 1. Жумла, конечно, хорошая CMS, но с ней сложно работать...
Мне нужно переделать саму логику цикла, но я не понимаю как, к сож. в PHP не ас, поэтому сюда и написал.

(Отредактировано автором: 17 Октября, 2014 - 19:25:53)

 
 Top
melomaniac
Отправлено: 17 Октября, 2014 - 19:48:45
Post Id



Новичок


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


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




usemind пишет:
Да, как Вы указываете работает все четко. Материал выводится только один - вот в чем беда.
В том то и дело, что мне нужно сразу подгружать ну хотя бы 3-10...
Т.е. тут без цикла никак... А если цикл, то уменьшая ID на 1 я ничего не добиваюсь... Вот и головоломка как узнать 10 ID предыдущих от 400-того, у которых категория == 1. Жумла, конечно, хорошая CMS, но с ней сложно работать...
Мне нужно переделать саму логику цикла, но я не понимаю как, к сож. в PHP не ас, поэтому сюда и написал.


А вы через что вывод смотрите, если не секрет ? Можете дописать

и сюда скинуть результат ?
 
 Top
usemind
Отправлено: 17 Октября, 2014 - 19:54:05
Post Id


Новичок


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


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




Смотрю по нажатию на кнопку Показать еще. Динамическая подгрузка материалов через AJAX.
Да, выводит все записи, когда добавил Ваш код. Почему тогда через AJAX этого не видно и выходит только 1 Оо.
Сделал порядок DESC и LIMIT 1, так как пока только по одному все-равно выводит...
____
UPD:
Логика:
я получаю через AJAX - ID последнего материала на странице.
Нажимаю на кнопку Показать еще и мне должны выводится материалы с ID меньшим чем последний на странице и принадлежащий к конкретной категории..

(Отредактировано автором: 17 Октября, 2014 - 20:09:34)

 
 Top
melomaniac
Отправлено: 17 Октября, 2014 - 22:01:57
Post Id



Новичок


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


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




usemind пишет:
Смотрю по нажатию на кнопку Показать еще. Динамическая подгрузка материалов через AJAX.
Да, выводит все записи, когда добавил Ваш код. Почему тогда через AJAX этого не видно и выходит только 1 Оо.
Сделал порядок DESC и LIMIT 1, так как пока только по одному все-равно выводит...
____
UPD:
Логика:
я получаю через AJAX - ID последнего материала на странице.
Нажимаю на кнопку Показать еще и мне должны выводится материалы с ID меньшим чем последний на странице и принадлежащий к конкретной категории..

AJAX или нет, это не так важно, с самой БД записи сейчас правильно выбираются ?


Посмотрите то что вы получаете с БД, если то что хотите, тогда копайте AJAX, если нет - нужно дальше с запросом думать Улыбка
 
 Top
usemind
Отправлено: 17 Октября, 2014 - 22:47:06
Post Id


Новичок


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


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




Да, то, что нужно. Мне получается нужно выбрать 10 материалов, ID у которых меньше 400 (например) и принадлежащие к категории 1, после чего записать все эти 10 ID полученных материалов в переменные и из них выгрести то, что требуется... Но как это сделать? Оо
 
 Top
usemind
Отправлено: 18 Октября, 2014 - 21:00:16
Post Id


Новичок


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


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




эх

(Отредактировано автором: 18 Октября, 2014 - 21:08:44)

 
 Top
usemind
Отправлено: 15 Декабря, 2014 - 17:15:16
Post Id


Новичок


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


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




Мб, кому пригодится. Решил проблему следующим образом:

PHP:
скопировать код в буфер обмена
  1. <?PHP
  2. //Мб, кому пригодится. Решил проблему следующим образом:
  3.  
  4.  
  5. //ON while
  6. $i = 0;
  7. while ($i <= 9){
  8. $db     = JFactory::getDBO();
  9. $query = 'SELECT id FROM #__content WHERE state=1 AND id < "'.$id.'" AND catid IN(1,2,3) ORDER BY id DESC LIMIT 1';
  10. $db->setQuery($query);
  11. $rows = $db->loadObjectList();
  12.  
  13. foreach ( $rows as $row )
  14. {
  15. $id_less = $row->id;
  16. }
  17.  
  18. //подкл к базе и выборка
  19. $query = 'SELECT * FROM #__content WHERE state=1 AND id = "'.$id_less.'" LIMIT 1';
  20. $db->setQuery($query);
  21. $rows = $db->loadObjectList();
  22.  
  23. foreach ( $rows as $row )
  24. {
  25. $id_content = $row->id;
  26. //etc
  27. }
  28.  
  29. //если id последнего материала, который извлекаем больше 1, то продолжаем выборку, если нет, то заканчиваем цикл хитрым способом
  30. // получается, что мы каждый раз узнаем id, который меньше из нужной категории и присваиваем его для id_less вконце
  31. // и снова узнавая id, который меньше из нужной категории, мы получаем необходимый нам id
  32. if ($id_less > 1)
  33. {$id = $id_less;
  34. $i++;}
  35. else {$i=10;}
  36.  
  37. }//OFF while
  38. ?>

(Отредактировано автором: 15 Декабря, 2014 - 17:47:04)

 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« SQL и Архитектура БД »


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



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

 
Powered by ExBB FM 1.0 RC1. InvisionExBB