Внутреннее соединение добавляется, если идентификатор совпадает - PullRequest
0 голосов
/ 19 мая 2018

Персона таблицы:

ID, ИМЯ, ВОЗРАСТ, ОПИСАНИЕ, СТАТУС

Значения:

1, Casey, 18, A fresh grad, Probation
2, Wedy, 25, Middle career, Approve
3, Stacy, 33, A working professional, Confirmed
4, Steve, 45, Senior Management, Confirmed
5, Goat, 55, Retire, Rejected

Разрешение таблицы:

PermID, TYPE, VALUE

Значения:

1, normaluser, can view training 1 and 2
1, probationuser, can view training 3 part 1
2, normaluser, can view training 1 and 2
2, traininguser, can view training 3
2, extradinoaryuser, Wendy can view full training
3, extradinoaryuser, Stacy can view full training
3, superuser, Stacy also can edit full training
3, supertrainer, can create full training

Пытается достичь:

  1. Отобразить полные данные таблицы Person с помощью «status» = Утверждено или «status» = Подтверждено

Вывод - отобразить идентификатор строки Person 2,3,4

Если сопоставить идентификатор человека с PermID разрешения, получить 'type' = extradinoaryuser или 'type' = superuser, игнорировать тип остальных, объединить с данными таблицы Person.

Тип вывода - добавить разрешение ''и' значение 'ID строки персонажа 2,3

Если запись имеет тип superuser и extradinoaryuser, продублируйте запись

Выходные данные - Строка 3 идентификатора человека дублируется как superuser, так и extradinoaryuser

Желаемые результаты:

2, Wedy, 25, Middle career, Approve, extradinoaryuser, Wendy can view full training<br/>
3, Stacy, 33, A working professional, Confirmed, extradinoaryuser, Stacy can view full training<br/>
3, Stacy, 33, A working professional, Confirmed, superuser, Stacy also can edit full training<br/>
4, Steve, 45, Senior Management, Confirmed

Команды Sql (не работает):

select Person.id, Person.name, Person.age, Person.description, Person.status 
from Person  
inner join Permission ON Person.id = Permission.PermID 
where Person.status like “Approve”  
   or Person.status like “Confirmed” 
  AND (permission.name = 'superuser' or permission.name = ‘extradinoaryuser’); 

Ответы [ 3 ]

0 голосов
/ 19 мая 2018

проблема в том, чтобы использовать правильные кавычки (""), а столбец license.name не существует.вместо этого используйте license.type

Схема построения:

create table Person
(ID int primary key Auto_Increment
, `NAME` varchar(25)
, AGE int
, DESCRIPTION varchar(255)
, STATUS varchar(25) );

insert into person values 
( 1, "Casey", 18, "A fresh grad", "Probation" ), 
(2, "Wedy", 25, "Middle career", "Approve"),
(3, "Stacy", 33, "A working professional", "Confirmed"), 
(4, "Steve", 45, "Senior Management", "Confirmed"), 
(5, "Goat", 55, "Retire", "Rejected");

create table Permission 
(PermID int
, `TYPE` varchar(25)
, `VALUE` varchar(255)
);

insert into Permission values
( 1, "normaluser","can view training 1 and 2"), 
(1, "probation user", "can view training 3 part 1"), 
(2, "normaluser", "can view training 1 and 2"), 
(2, "traininguser", "can view training 3"), 
(2, "extradinoaryuser", "Wendy can view full training"), 
(3, "extradinoaryuser", "Stacy can view full training"),
(3, "superuser", "Stacy also can edit full training"), 
(3,"supertrainer", "can create full training");

Исправьте запрос как

Сначала получите всех пользователей, которые имеют статус Утвердить или Подтверждено, а затем отфильтруйте пользователятип разрешения как суперпользователь или экстрадопользователь или ноль для отображения, у пользователя нет прав

select * 
  from ( select Person.id
          , Person.name
          , Person.age
          , Person.description
          , Person.status
          , Permission.type
          , Permission.value
      from Person 
      left 
      join Permission 
        ON Person.id = Permission.PermID
     where (Person.status like "Approve" or Person.status like "Confirmed")
        ) t 
 where (t.type = 'superuser' or t.type = "extradinoaryuser" or t.type IS NULL) ;

см. результат в http://sqlfiddle.com/#!9/f5a6be/27

0 голосов
/ 19 мая 2018

Кажется, проблема в ваших цитатах.Однако я бы порекомендовал две вещи для запроса:

  • Псевдонимы таблицы.
  • IN

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

select p.id, p.name, p.age, p.description, p.status 
from Person p inner join
     Permission pn
     ON p.id = pn.PermID 
where p.status in ('Approve', 'Confirmed') and
      pn.name in ('superuser', 'extradinoaryuser'); 

В SQL стандартным разделителем строк являются одинарные кавычки.Их следует использовать для определения констант строки и даты (а не для других целей).

0 голосов
/ 19 мая 2018

Используйте правильные кавычки ('') для строковых переменных:

select p.id, p.name, p.age, p.description, p.status 
  from Person p inner join Permission m ON ( p.id = m.PermID )
 where p.status like 'Approve' or p.status like 'Confirmed'
   and (m.name = 'superuser' or m.name = 'extradinoaryuser');

PS Удостоверьтесь в (нижнем / верхнем) случаях строковых значений в ваших таблицах.

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