Приложение PHP / Laravel - запросить две таблицы базы данных, связанные через третью таблицу?Внутреннее соединение - PullRequest
0 голосов
/ 18 октября 2018

Я работаю над приложением Laravel / Angular, и на одной из страниц у меня есть форма, отображающая таблицу с информацией о количестве учетных записей.Один из столбцов таблицы называется «Контакт», и в каждой ячейке столбца отображается имя контакта по умолчанию для этой записи таблицы.

В ячейках этого столбца также отображается кнопка «Редактировать»,при нажатии на которую открывается диалоговое окно, позволяющее пользователю добавить еще один контакт к этой записи таблицы - диалоговое окно отображает форму с полями «имя», «фамилия» и «электронная почта» и имеет кнопку «Добавить контакт».

Существует также краткий «предварительный просмотр» того, как имя должно отображаться в письме, сгенерированном для отправки этому пользователю, то есть «Привет фамилия» или «Привет имя», в зависимости от типа контакта,и используемый шаблон письма.

У меня возникли некоторые проблемы с отображением соответствующего имени, потому что я не уверен, как написать SQL-запрос, мне нужно получить соответствующее имя.

Таблицы настроены таким образом, что таблица account.account содержит значения для:

'идентификатор учетной записи', 'имя учетной записи', идентификатор типа учетной записи ',

аи таблица account.property содержит значения для

'идентификатор свойства', метка свойства ',' тег свойства ',' описание свойства '.

В таблице account.property естьдве строки, которые содержат имена, которые будут использоваться для различных способов связи - одна с тегом свойства addresseename, а другая с тегом свойства addresseenamepdf.Я хочу отобразить эти значения в окне предварительного просмотра в диалоговом окне, но я не уверен, как написать SQL для их извлечения.

Насколько я вижу, первичного / внешнего ключа нетотношения между таблицами, но мне сказали, что они связаны с использованием View account.vAccount.Прошло несколько лет с тех пор, как я занимался чем-то большим, чем простейшее программирование баз данных с использованием SQL, и раньше я не сталкивался с представлениями, поэтому не уверен, как использовать их в запросе ...

В MSSQL SMS, если я щелкну правой кнопкой мыши на представлении account.vAccount и выберу 1000 верхних строк, я увижу, что запрос:

SELECT TOP (1000) [accountId]
  ,[name]
  ,[typeId]
  ,[accountType]
  ,[accountTypeTag]
  ,[typeParentId]
  ,[parentAccountType]
  ,[parentAccountTypeName]
  ,[balanceDate]
  , // several other values here
FROM [myDB].[account].[vAccount]

запущен, и мне представлен список результатов,который я могу отфильтровать, добавив в конец запроса предложение where:

FROM [myDB].[account].[vAccount] where accountId = 53092;

, и это просто возвращает строку view для этой конкретной учетной записи.Однако я не вижу столбцы addresseename & addresseenamepdf, данные которых я хочу извлечь из таблицы account.property.

Мое (ограниченное) понимание SQL говорит мне, что мне нужно будет создатьсвязь между этими двумя таблицами, чтобы можно было запрашивать значения addressename & addresseenamepdf, которые я хочу, используя только значение accountId (т.е. иметь внешний ключ из одной из таблиц в другой таблице).

Правильно ли мое понимание здесь, или я могу использовать view для извлечения этих данных без создания связи между таблицами?Если бы я мог, как бы я это сделал?

- Правка -

Так что, похоже, я упустил, что эти две таблицы на самом деле связаны через третьютаблица (я только начал работать над этим приложением) - таблицы:

account

  • accountID (PK)
  • имя
  • typeId
  • ...

propertyValue

  • propertyValueId (PK)
  • accountId
  • propertyId
  • ...

property

  • propertyId (PK)
  • propertyLabel
  • propertyTag
  • ...

Таблицы имеют отношения:

account one-to-many propertyValue many-to-one свойство

Как мне написать запрос, который будет возвращать два конкретных свойства (свойства, значения которых propertyId48 & 49 для учетной записи, где значение accountId равно 53092?

Имеюпопытался выполнить запрос:

SELECT TOP (1000) [accountID]
    ,[name
    ...
FROM [myDB][account].[account] where accountID = 53092
INNER JOIN [myDB].[account].[propertyValue] where propertyTag = 'ADDRESSEENAME' | propertyTag = 'ADDRESSEENAMEPDF';

но когда я пытаюсь выполнить, я получаю сообщение об ошибке:

Неверный синтаксис рядом с ключевым словом 'INNER'.

Почему я получаю это?Что я делаю не так?

1 Ответ

0 голосов
/ 18 октября 2018

Структура запроса должна быть

Select 
From
join on
where
group by
Having.

У вас есть предложение where перед предложением join.

Измените на:

SELECT TOP (1000) [accountID]
    ,[name
    ...
FROM [myDB][account].[account] 
INNER JOIN [myDB].[account].[propertyValue] ON … (you are missing the on clause)
where accountID = 53092 and (
propertyTag = 'ADDRESSEENAME' | propertyTag = 'ADDRESSEENAMEPDF');
...