Итак, я изменил запрос, полученный из этой цепочки , однако, когда я фильтрую между тегами и кошками, результат нежелателен.Фильтрация для категории 5 вернет только информацию о списке категорий, и теги будут пустыми, в то время как для тегов применяется обратное.
SELECT posts.id,time,title,
GROUP_CONCAT(IFNULL(cats.id, '') ORDER BY cats.id DESC SEPARATOR '~') as catIdList,
GROUP_CONCAT(IFNULL(cats.name, '') ORDER BY cats.id DESC SEPARATOR '~') as catNameList,
GROUP_CONCAT(IFNULL(cats.slug, '') ORDER BY cats.id DESC SEPARATOR '~') as catSlugList,
GROUP_CONCAT(IFNULL(cats.value, '') ORDER BY cats.id DESC SEPARATOR '~') as catValueList,
GROUP_CONCAT(IFNULL(tags.id, '') ORDER BY tags.id DESC SEPARATOR '~') as tagIdList,
GROUP_CONCAT(IFNULL(tags.name, '') ORDER BY tags.id DESC SEPARATOR '~') as tagNameList,
GROUP_CONCAT(IFNULL(tags.slug, '') ORDER BY tags.id DESC SEPARATOR '~') as tagSlugList,
GROUP_CONCAT(IFNULL(tags.value, '') ORDER BY tags.id DESC SEPARATOR '~') as tagValueList
FROM posts
LEFT JOIN termRelations ON ( posts.id = termRelations.postId )
LEFT JOIN cats ON ( termRelations.termId = cats.id AND termRelations.termTypeId = 1 )
LEFT JOIN tags ON ( termRelations.termId = tags.id AND termRelations.termTypeId = 0 )
WHERE ( ( IFNULL(tags.id, '') = '4' ) )
GROUP BY posts.id ORDER BY time DESC
IFNULL () предназначен для обхода несуществующих записей.Приведенный выше запрос вернет:
(
[id] => 15
[time] => 0
[title] => post 15
[catIdList] =>
[catNameList] =>
[catSlugList] =>
[catValueList] =>
[tagIdList] => 4
[tagNameList] => tagname
[tagSlugList] => tagname
[tagValueList] =>
)
(
[id] => 16
[time] => 0
[title] => post 16
[catIdList] =>
[catNameList] =>
[catSlugList] =>
[catValueList] =>
[tagIdList] => 4
[tagNameList] => tagname
[tagSlugList] => tagname
[tagValueList] =>
)
Хотя без WHERE ( ( IFNULL(tags.id, '') = '4' ) )
результат будет (наряду со всеми другими сообщениями из-за того, что он не отфильтрован по этому тегу, конечно):
(
[id] => 15
[time] => 0
[title] => post 15
[catIdList] =>
[catNameList] =>
[catSlugList] =>
[catValueList] =>
[tagIdList] => 4
[tagNameList] => tagname
[tagSlugList] => tagname
[tagValueList] =>
)
(
[id] => 16
[time] => 0
[title] => post 16
[catIdList] => 5~~
[catNameList] => Movies~~
[catSlugList] => movies~~
[catValueList] => ~~
[tagIdList] => 4~1~
[tagNameList] => tagname~sand~
[tagSlugList] => tagname~sand~
[tagValueList] => ~~
)
Это, конечно, то, что я хочу - вся необходимая информация!
Таблицы:
termRelations
содержит идентификатор записи и идентификатор термина, причем termTypeId различаеткошки и метки столы. cats
содержит идентификатор термина и информацию о категории (имя, слаг, parentId и т. Д.) tags
содержит идентификатор термина и информацию о теге (имя, слаг и т. Д.) posts
содержит информацию о сообщении (название, время, текст и т. Д.)
Цель termRelations - привязать теги и категории к сообщениям.Цель этого запроса - вернуть отфильтрованные результаты (я хочу, чтобы пользователи могли просматривать сообщения с определенным тегом, а также с определенной категорией.), Сохраняя при этом полную информацию.
Возможно ли, что этобыть решенным путем объединения таблиц cats
и tags
в terms
?
Хотелось бы, чтобы я знал, как, но на этом этапе я в значительной степени наталкиваюсь на это.Так что, немного помощи :)?Спасибо !!