MySQL дубликат столбца при выборе из выбора - PullRequest
1 голос
/ 15 июня 2019

У меня есть несколько таблиц:

  • ресурсы (которые содержат все сообщения)

    pid |usrnm |название |ссылка |содержание |стить |Sdesc |в |лайки

  • теги (которые содержат все теги и идентификатор)

    id |slug

  • retags (который связывает ресурс и его теги)

    pid |tid

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

Я использую SQL для поиска по тэгам:

SELECT
   resources.pid, resources.title
FROM resources
INNER JOIN retags ON resources.pid = retags.pid
INNER JOIN tags   ON retags.tid = tags.id
GROUP BY resources.pid 
HAVING
    SUM(tags.slug = 'tag-z')
  AND
    SUM(tags.slug = 'tag-y')

Как я могу применить SQL для значения поиска WHERE title LIKE '%bla%' и порядка ORDER BY at DESC к этому поисковому тегу SQL?Я пытался выбрать из выбора, но продолжал получать ошибки, такие как «Didlicate column pid», «Colid 'pid' в списке полей неоднозначен" и т. Д.

Может кто-нибудь помочь мне с этим SQL?Спасибо

Я попробовал все в StackOverflow, как использование псевдонима для имени столбца на одном SELECT pid as pid_ ... и даже на обоих выборках, но я все еще продолжал получать ту же ошибку дублирующегося столбца.

EDIT:SQL, из которого я получаю ошибки:

SELECT * FROM 
(SELECT * FROM resources
 INNER JOIN retags ON resources.pid = retags.pid
 INNER JOIN tags ON retags.tid = tags.id
 GROUP BY resources.pid
 HAVING
   SUM(tags.slug = 'A2') AND 
   SUM(tags.slug = 'AS')
) AS tsr WHERE tsr.title LIKE '%bla%' ORDER BY tsr.`at` DESC

Это только один из них, я пробовал много разных типов из других постов и разные ошибки, которые я получаю от них.

1 Ответ

0 голосов
/ 15 июня 2019

Предложение WHERE идет до GROUP BY:

SELECT rs.pid, rs.title
FROM resources rs JOIN
     retags rt
     ON rs.pid = rt.pid JOIN
     tags t
     ON rt.tid = t.id
WHERE rs.title LIKE '%bla%'
GROUP BY rs.pid 
HAVING SUM(t.slug = 'tag-z') AND
       SUM(t.slug = 'tag-y')
ORDER BY MAX(rs.at);

Строго говоря, MAX() не требуется в ORDER BY при условии, что pid однозначно идентифицирует каждую строку в resources.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...