Мои данные повторяются, когда я ищу любое ключевое слово - PullRequest
0 голосов
/ 08 июня 2019

Я пытаюсь сделать запрос, который ищет из двух таблиц patient и prescription, и я выбираю столбцы для вывода из обеих таблиц.Я использую inner join и хочу, чтобы, когда я пишу одно слово в searchbox, оно проверяло его в одном столбце, если совпадение отображало его, а если не совпадало, то выполняло поиск в следующем столбце и т. Д.

Для этой цели я делаю следующий запрос, который совсем не сложен, просто несколько длинен, и я применяю много like операторов.

select distinct( pr.case_no) as CaseNo , 
       p.name as PatientName, 
       p.phone as PatientPhone,
       pr.visit_no as VisitNo,
       pr.assign_doctor as DoctorAssigned ,
       pr.date as  Date,
       pr.diet_chart as DietChart  
from  prescription pr, patient p 
where  p.p_id =pr.p_id 
       and 
       p.name like '%'+@input+'%' 
       or 
       pr.case_no  like '%'+@input+'%' 
       or 
       p.phone  like '%'+@input+'%' 
       or 
       pr.visit_no  like '%'+@input+'%' 
       or 
       pr.assign_doctor  like '%'+@input+'%' 
       or 
       pr.date  like '%'+@input+'%' 
       or 
       pr.diet_chart  like '%'+@input+'%' 

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

Я хочу, чтобы одна запись отображалась один раз, но она повторяла записи.Выходные данные этого запроса enter image description here я хочу, чтобы данные вообще не повторялись и делает группу на основе case_no ........ где запрос должен быть изменен ... пожалуйста, помогите

1 Ответ

2 голосов
/ 08 июня 2019

Проблема в том, что AND имеет приоритет над OR.поэтому ваше условие where эквивалентно

WHERE
   ( p.p_id = pr.p_id 
     AND 
     p.name like '%'+@input+'%'
   )
   OR 
   pr.case_no  like '%'+@input+'%' 
   OR 
   p.phone  like '%'+@input+'%' 
   ...

, добавьте скобки, подобные этому

WHERE
   p.p_id = pr.p_id 
   AND 
   ( p.name like '%'+@input+'%'
     OR 
     pr.case_no  like '%'+@input+'%' 
     OR 
     p.phone  like '%'+@input+'%' 
     ...
   )

Однако, как сказал @Sami, используйте синтаксис JOIN:

SELECT pr.case_no,
    p.name as PatientName,
    p.phone as PatientPhone,
    pr.visit_no as VisitNo,
    pr.assign_doctor as DoctorAssigned ,
    pr.date as  Date,
    pr.diet_chart as DietChart  
FROM
    patient p
    LEFT JOIN prescription pr
        ON p.p_id = pr.p_id
WHERE
    p.name like '%'+@input+'%' OR
    pr.case_no  like '%'+@input+'%' OR
    p.phone  like '%'+@input+'%' OR
    pr.visit_no  like '%'+@input+'%' OR
    pr.assign_doctor  like '%'+@input+'%' OR
    pr.date  like '%'+@input+'%' OR
    pr.diet_chart  like '%'+@input+'%'

LEFT JOIN имеет преимущество возвращать пациентов без рецепта;в противном случае с INNER JOIN вы будете скучать по пациентам, у которых еще нет рецептов.Кроме того, у вас есть четкое различие между условиями соединения и дополнительными условиями фильтрации.

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