MySQL, нужна помощь в определении нескольких запросов на соединение, чтобы получить полную информацию - PullRequest
2 голосов
/ 04 января 2012

Итак, я изменил запрос, полученный из этой цепочки , однако, когда я фильтрую между тегами и кошками, результат нежелателен.Фильтрация для категории 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] => ~~
    )

Это, конечно, то, что я хочу - вся необходимая информация!

Таблицы:

  1. termRelations содержит идентификатор записи и идентификатор термина, причем termTypeId различаеткошки и метки столы.
  2. cats содержит идентификатор термина и информацию о категории (имя, слаг, parentId и т. Д.)
  3. tags содержит идентификатор термина и информацию о теге (имя, слаг и т. Д.)
  4. posts содержит информацию о сообщении (название, время, текст и т. Д.)

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

Возможно ли, что этобыть решенным путем объединения таблиц cats и tags в terms?

Хотелось бы, чтобы я знал, как, но на этом этапе я в значительной степени наталкиваюсь на это.Так что, немного помощи :)?Спасибо !!

1 Ответ

1 голос
/ 04 января 2012

Измените WHERE на EXIST с подзапросом:

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 EXISTS
      ( SELECT *
        FROM termRelations 
        WHERE termRelations.termId = '4'
          AND termRelations.termTypeId = 0
          AND posts.id = termRelations.postId
      )
GROUP BY posts.id 
ORDER BY time DESC
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...