Перейти к содержимому



Вывод статьи в нескольких категориях

#1 bo4kov
bo4kov
  • Неактивные
  • 26 сообщений
  • Репутация: 0
0

Отправлено 05 Май 2015 - 16:57

Здравствуйте! Я хочу реализовать вывод статей по категориям, при том что статья может быть в нескольких категориях. 

В общем вывод статьи (которая относится к одной категории) работает, вот код: 

$category = 1; // id категории 
$query = "(SELECT * FROM `articles` WHERE cat_articles = $category)"; // cat_articles - id категории к которой относится статья 
$res = mysql_query($query); 
$products = array(); 
 while($row = mysql_fetch_assoc($res)){ 
   $products[] = $row; 
} 
print_r($products);

А как сделать вывод статьи которая относится к нескольким категориям, например cat_articles = 1|5|20   ? 
Здесь нужно использовать explode(). Но как все это связать с sql запросом? может нужно делать два запроса?


 

 

  • 0

#2 ShowPrint
ShowPrint
  • Пользователь PRO
  • 3 406 сообщений
  • Репутация: 1001

Отправлено 05 Май 2015 - 19:49

Попробуйте cat_articles заключать в "спец.символы" с двух сторон, т.е. для Вашего примера: 

cat_articles = |1|5|20|

 и запрос сформировать следующим образом:

$query = "(SELECT * FROM 'articles' WHERE cat_articles LIKE '|'.$category.'|')";

Если не получится, то почитайте про LIKE в рунете, давно пользовался - точно не помню... В таких случаях точно используется LIKE, сомнения лишь в том как правильно прописать:

'|'.$category.'|'

  • 0
MasterWEBS: третий дом - моё хобби и увлечение... Второй дом: работа - не меньше 12 часов в день...
Первый дом - под охраной: "Осторожно - злая жена!" (дрессировалась долго и надёжно) /*ссылку не просите - не дам!*/


#3 bo4kov
bo4kov
    Topic Starter
  • Неактивные
  • 26 сообщений
  • Репутация: 0

Отправлено 06 Май 2015 - 15:17

@ShowPrint, спасибо большое. Насчет оформления, то вот так у меня работает:

$query = "(SELECT * FROM 'articles' WHERE cat_articles LIKE ('%|" .$category. "|%')";

  • 0

#4 ShowPrint
ShowPrint
  • Пользователь PRO
  • 3 406 сообщений
  • Репутация: 1001

Отправлено 06 Май 2015 - 15:25

@bo4kov, вполне логично, почему нет... Рад что смог помочь... Не забывайте "спец.символы" ставить с двух сторон во избежание недоразумений...


  • 0
MasterWEBS: третий дом - моё хобби и увлечение... Второй дом: работа - не меньше 12 часов в день...
Первый дом - под охраной: "Осторожно - злая жена!" (дрессировалась долго и надёжно) /*ссылку не просите - не дам!*/


#5 Ixman
Ixman
  • Пользователь PRO
  • 3 171 сообщений
  • Репутация: 844

Отправлено 06 Май 2015 - 15:29

@ShowPrint,@bo4kov,  LIKE вообще нужно исключить из своего рациона, это гадость будет сильно тормозить при больших объёмах информации  и посещаемости

@bo4kov, а так подробнее бы о том как ваши id храняться, и вообще точнее изложите суть. А вообще делается элементарно

WHERE cat_articles IN ('1','5','20') ... 

И хранить связи статьи с категориями лучше всего в отдельной таблице, если нужно более подробно я могу разжевать


  • 0


#6 bo4kov
bo4kov
    Topic Starter
  • Неактивные
  • 26 сообщений
  • Репутация: 0

Отправлено 06 Май 2015 - 15:29

@Ixman, ну а другой способ решения моей задачи  - это только создавать дополнительную таблицу с id статьи и id категории, а потом с помощью JOIN выводить, так? или есть еще способы? 


  • 0

#7 Ixman
Ixman
  • Пользователь PRO
  • 3 171 сообщений
  • Репутация: 844

Отправлено 06 Май 2015 - 15:35

@bo4kov, да таблица с ID категории и ID статьи но выводится тем же способом что и я показал выше, только там вместо перечисления ID sql запрос, выглядит как-то так

WHERE cat_articles IN (SELECT `cat_id` FROM `article2category` WHERE `art_id` = '1') ... 

  • 0


#8 bo4kov
bo4kov
    Topic Starter
  • Неактивные
  • 26 сообщений
  • Репутация: 0

Отправлено 06 Май 2015 - 15:35

@Ixman,  Ну допустим id категории в статье хранится вот в таком виде 1|2|3|5. В общем у меня пока тестовая таблица так что все можно будет изменить. Так что все таки лучше использовать доп. таблицу? или вложенный запрос IN() подойдет? Что быстрее работает и не тормозит сайт?


  • 0

#9 Ixman
Ixman
  • Пользователь PRO
  • 3 171 сообщений
  • Репутация: 844

Отправлено 06 Май 2015 - 15:36

Данный способ работает безупречно, опробовано лично мное не раз


  • 0


#10 bo4kov
bo4kov
    Topic Starter
  • Неактивные
  • 26 сообщений
  • Репутация: 0

Отправлено 06 Май 2015 - 15:39

@Ixman, спасибо, ну тогда пойду создавать таблицу  


  • 0

#11 Ixman
Ixman
  • Пользователь PRO
  • 3 171 сообщений
  • Репутация: 844

Отправлено 06 Май 2015 - 15:39

@bo4kov, лучше дополнительная таблица, с ей в последствии проще работать, а так ваш вариант  $cat_id = str_replace("|", "','" , "1|2|3|5"); ну и потом в запросе WHERE ... IN ('" . $cat_id . "')


Сообщение отредактировал Ixman: 06 Май 2015 - 15:40

  • 0


#12 bo4kov
bo4kov
    Topic Starter
  • Неактивные
  • 26 сообщений
  • Репутация: 0

Отправлено 06 Май 2015 - 15:41

@Ixman, ну в общем вы меня переубедили, лучше создам таблицу 


  • 0

#13 ShowPrint
ShowPrint
  • Пользователь PRO
  • 3 406 сообщений
  • Репутация: 1001

Отправлено 06 Май 2015 - 15:42

@Ixman, с моей посещаемостью менее 100 уников ресурсов хватало "за глаза", но Ваша трактовка несомненно более верная и логичная

 

@bo4kov, советую прислушаться к @Ixman:

а) "тяжелая артилерия" профессионалов никогда не подводила

б) @Ixman никогда - никому - ничего плохого не советовал...


  • 0
MasterWEBS: третий дом - моё хобби и увлечение... Второй дом: работа - не меньше 12 часов в день...
Первый дом - под охраной: "Осторожно - злая жена!" (дрессировалась долго и надёжно) /*ссылку не просите - не дам!*/


#14 bo4kov
bo4kov
    Topic Starter
  • Неактивные
  • 26 сообщений
  • Репутация: 0

Отправлено 06 Май 2015 - 15:44

@ShowPrint, спасибо, обязательно прислушаюсь, всем спасибо за помощь, пойду наконец таки решу эту задачку. 


  • 0

#15 Ixman
Ixman
  • Пользователь PRO
  • 3 171 сообщений
  • Репутация: 844

Отправлено 06 Май 2015 - 15:44

@ShowPrint, логика такая, привыкаешь делать "плохо" - оно потом так и делается постоянно, поэтому даже при условии что нагрузки не будет, лучше всегда делать оптимально выгодно.

 

Спасибо за добрые слова ))


  • 0


#16 ShowPrint
ShowPrint
  • Пользователь PRO
  • 3 406 сообщений
  • Репутация: 1001

Отправлено 06 Май 2015 - 15:57

@Ixman, полностью согласен и поддерживаю... Но я из разряда "любителей", поэтому делал как мог, вернее как нашел в толстых книжках и в мануалах... Тогда у меня еще не было этого форума, а сейчас Ваш совет уже у меня в "закладках"...

"За добрые слова" не стоит - это правда!


  • 0
MasterWEBS: третий дом - моё хобби и увлечение... Второй дом: работа - не меньше 12 часов в день...
Первый дом - под охраной: "Осторожно - злая жена!" (дрессировалась долго и надёжно) /*ссылку не просите - не дам!*/


#17 miketomlin
miketomlin
  • Пользователь
  • 555 сообщений
  • Репутация: 117

Отправлено 23 Май 2015 - 19:45

Если общее число категорий невелико, можно использовать битовое поле. Чтобы запрос имел стандартный вид и мог выполняться непосредственно движком, можно использовать представления.

 

Т.е. сделать для всех статей общую таблицу с битовым полем и для каждой категории свое представление (VIEW) для выбора статей данной категории.


  • 0


#18 miketomlin
miketomlin
  • Пользователь
  • 555 сообщений
  • Репутация: 117

Отправлено 23 Май 2015 - 20:06

Подумал, что в плане SEO одна и та же статья в разных категориях (и, насколько я понимаю, доступная по разным адресам) может расцениваться, как дубль. А если все-таки статью размещать в одной категории, а в других оставлять ссылки на нее.


  • 0


#19 bo4kov
bo4kov
    Topic Starter
  • Неактивные
  • 26 сообщений
  • Репутация: 0

Отправлено 24 Май 2015 - 18:52

@miketomlin, я тоже об этом подумал. Ну в моем случае статья находится по такому адресу, в не зависимости от того в какой категории она находится  - site.ru/?view=article&id=4. Ну вот вопрос - а что если название статьи и ссылка выводятся на двух страницах(в разных категориях), например site.ru/?view=cat&id=1 и site.ru/?view=cat&id=2? это считается дублем статьи?


Сообщение отредактировал bo4kov: 24 Май 2015 - 18:53

  • 0

#20 miketomlin
miketomlin
  • Пользователь
  • 555 сообщений
  • Репутация: 117

Отправлено 24 Май 2015 - 19:07

Нет, конечно. Если в адресе статьи отсутствует указание на категорию, тогда все в порядке.


  • 0


robot
robot
  • Пользователь PRO
  • 2 652 сообщений
  • Репутация: 85


Похожие темы
  Название темы Автор Статистика Последнее сообщение

Пользователь месяца
Totti Totti 1-й за Январь
Очков активности: 3 937 6 тем, 87 сообщений, 25 баллов репутации
ТОП самых активных за этот месяц
  • Фотография Megoydagi
    #1

    Megoydagi (24ho.ru)
    Очков активности: 382.5 3 темы, 42 сообщения, 5 баллов репутации

  • Фотография NataliaAntalia
    #2

    NataliaAntalia (zdorovemedicina.ru)
    Очков активности: 66 Вне конкурса за определение пользователя месяца

  • Фотография magnet
    #3

    magnet (rbfxdirect.com)
    Очков активности: 54 2 темы, 30 сообщений, 1 балл репутации

  • Фотография albedo
    #4

    albedo (online24news.ru)
    Очков активности: 33 1 тема, 19 сообщений, 1 балл репутации

  • Фотография BLIK
    #5

    BLIK
    Очков активности: 24 Вне конкурса за определение пользователя месяца

  • Фотография TindrumGM
    #6

    TindrumGM (novosti-land.ru)
    Очков активности: 22.5 4 темы, 3 сообщения, 1 балл репутации

  • Фотография Step01
    #7

    Step01
    Очков активности: 19.5 2 темы, 7 сообщений, 1 балл репутации

  • Фотография Totti
    #8

    Totti
    Очков активности: 19.5 Вне конкурса за определение пользователя месяца

  • Фотография ignis
    #9

    ignis
    Очков активности: 18 1 тема, 9 сообщений, 1 балл репутации

  • Фотография WGN
    #10

    WGN (worldgamenews.com)
    Очков активности: 16.5 0 тем, 11 сообщений, 1 балл репутации

  • Показать весь ТОП 10
Поддержите форум! =)
Апдейты
  • Яндекс ИКС: 30.01.2020
  • Яндекс выдача: 17.02.2020
Топ 5 участников по репутации

Оформление форума – IPBSkins.ru