MySQL JOIN основан на динамическом операторе LIKE между несколькими таблицами - PullRequest
0 голосов
/ 27 сентября 2011

У меня есть таблица с именем faq.Эта таблица состоит из полей faq_id, faq_subject.У меня есть еще одна таблица с именем article, которая состоит из article_id, ticket_id, a_body и хранит статьи в определенном билете.Естественно, есть также таблица «тикет» с полями ticket_id, ticket_number.

Я хочу получить таблицу результатов в формате: ticket_number, faq_id, faq_subject.

Для этого мне нужно найти faq_id в поле article. a_body, используя оператор% LIKE%.

Мой вопрос, как я могу сделать это динамически, чтобыЯ возвращаю с SQL одну таблицу результатов, которая находится в формате ticket_number, faq_id, faq_subject.

Я пробовал несколько конфигураций операторов UNION ALL, LEFT JOIN, LEFT OUTER JOIN, но онивсе возвращают либо слишком много строк, либо имеют разные проблемы.

Возможно ли это даже с MySQL, и возможно ли написать оператор SQL, который содержит @variables и может позаботиться об этом?

Ответы [ 2 ]

3 голосов
/ 27 сентября 2011

Во-первых, такой дизайн проблематичен.У вас есть определенные данные, встроенные в другой столбец, что может вызвать как логику, так и проблемы с производительностью (поскольку вы не можете индексировать a_body таким образом, чтобы это помогло JOIN).Если это одноразовая вещь, то это одна проблема, но в противном случае у вас будут проблемы с этим дизайном.

Во-вторых, рассмотрите этот пример: вы ищете faq_id # 123.У вас есть статья, включающая faq_id 4123. В итоге вы получите ложное совпадение.Вы можете встраивать значения faq_id в текст с некоторой разметкой (например, [faq_id:123]), но в этот момент вы можете также сохранить их в другой таблице.

Следующий запрос должен работать (я думаю, что MySQL поддерживает CAST, если нет, то вам может потребоваться настроить его).

SELECT
    T.ticket_number,
    F.faq_id,
    F.faq_subject
FROM
    Articles A
INNER JOIN FAQs F ON
    A.a_body LIKE CONCAT('%', F.faq_id, '%')
INNER JOIN Tickets T ON
    T.ticket_id = A.ticket_id

EDIT: Исправлено для использования CONCAT

0 голосов
/ 27 сентября 2011
SELECT DISTINCT t.ticket_number, f.faq_id, f.faq_subject
FROM faq.f
INNER JOIN article a ON (a.a_body RLIKE CONCAT('faq_id: ',faq_id))
INNER JOIN ticket t ON (t.ticket_id = a.ticket_id)
WHERE somecriteria
...