как сопоставить количество атрибутов в MySQL - PullRequest
0 голосов
/ 24 февраля 2019

У меня есть база данных, в которой я храню симптомы и идентификатор бумаги (на какой бумаге используется тот или иной симптом), многие симптомы могут быть в одном документе, и во многих документах есть один симптом.

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

SELECT paper_id ,symptom_name FROM My_table
WHERE (symptom_name= "" AND symptom_name= "")

Теперь я хочу знать, что, если я не знаю, сколько симптомов у пользователябудет вводить, и если пользователь вводит n число симптомов, то мой запрос будет соответствовать всем n симптомам и даст мне результат.

Проще говоря, этот запрос предназначен для двух симптомов, как я могу заставить его работать для n количества симптомов.

Ответы [ 3 ]

0 голосов
/ 24 февраля 2019

Для этого нужны три разные таблицы.

  • papers содержит поля paper_id (первичный ключ), имя, заголовок и т. Д.
  • symptoms содержит поляsymptom_id (первичный ключ), имя и т. Д.
  • paper_symptoms содержит свой первичный ключ, paper_id и symptom_id.

Каждая бумага имеет одну строкув papers, и каждый симптом имеет одну строку в symptoms.

Если бумага с paper_id 1 связана с двумя симптомами (например, с symptom_id значениями 6 и 7), тогдаpaper_symptoms таблица получает две строки:

paper_symptom_id  paper_id  symptom_id
(autogenerated)   1         6
(autogenerated)   1         7

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

select s.*
from papers p
inner join paper_symptoms ps
on ps.paper_id = p.paper_id
inner join symptoms s
on s.symptom_id = ps.symptom_id
where p.paper_id = 1
0 голосов
/ 24 февраля 2019

Вы можете использовать пересечение результатов запроса для каждого симптома, используя внутреннее соединение как.

SELECT distinct paper_id
FROM My_table as t1
inner join My_table as t2
WHERE t1.symptom_name= "Symtom_1" and t2.symptom_name= "Symtom_2"
0 голосов
/ 24 февраля 2019

Вы можете использовать выражение IN:

SELECT paper_id ,symptom_name 
FROM My_table
WHERE symptom_name IN ("symptom1", "symptom2", "symptom3", "symptom4")

Это даст документы, которые содержат любой из симптомов.Если вам нужны документы, которые имеют всех симптомов, вам нужен запрос, подобный следующему:

SELECT paper_id
FROM My_table
WHERE symptom_name IN ("symptom1", "symptom2", "symptom3", "symptom4")
GROUP BY paper_id
HAVING COUNT(DISTINCT symptom_name) = 4
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...