MySQL - внутреннее соединение при ошибке запроса 1052 - PullRequest
0 голосов
/ 10 апреля 2020

Я пытаюсь выполнить запрос на выборку таблицы вместе с внутренним соединением, чтобы потом связать данные от владельца с кошками

ownercat использует внешний ключ для идентификатора, связывающегося с идентификатором ownerinfo id

USE CATTERY;
SELECT
OWNERINFO.ID, OWNERINFO.First_Name, OWNERINFO.Last_Name, OWNERINFO.Phone, OWNERINFO.AddrL1, OWNERINFO.AddrL2, OWNERINFO.AddrL3, OWNERINFO.PostCode,
GROUP_CONCAT(DISTINCT OWNERCAT.Chip_ID)
FROM OWNERINFO
INNER JOIN OWNERCAT ON OWNERINFO.ID = OWNERCAT.ID

WHERE ID = 1;

Я получил следующую ошибку: Код ошибки: 1052. «Идентификатор столбца», в котором предложение неоднозначно 0,0014 se c

удаление оператора выражения concat по-прежнему вызывает ту же ошибку Я не уверен, как обойти эту проблему

Ответы [ 2 ]

2 голосов
/ 10 апреля 2020

Вам необходимо определить, из какой таблицы берется предложение ID в WHERE (вы можете использовать псевдонимы). Во-вторых, поскольку вы используете GROUP_CONCAT, в запросе должно быть GROUP BY:

SELECT
  oi.ID, 
  oi.First_Name, 
  oi.Last_Name, 
  oi.Phone, 
  oi.AddrL1, 
  oi.AddrL2, 
  oi.AddrL3, 
  oi.PostCode,
  GROUP_CONCAT(DISTINCT oc.Chip_ID)
FROM OWNERINFO oi
  INNER JOIN OWNERCAT oc ON oc.ID=oi.ID
WHERE oi.ID = 1
GROUP BY oi.ID
1 голос
/ 10 апреля 2020

Проблема в предложении WHERE: ID неоднозначно, поскольку этот столбец доступен в обеих таблицах.

Вы можете подумать, что, поскольку вы объединяете таблицы в ID, база данных может сказать, что она имеет то же значение, но на самом деле это не так.

Так что просто уточните столбец в предложении WHERE, ie измените это:

WHERE ID = 1

на:

WHERE OWNERINFO.ID = 1

или эквивалент:

WHERE OWNERCAT.ID = 1

Также обратите внимание, что в вашем запросе используется GROUP_CONCAT(), который является агрегатной функцией. Это означает, что вам нужно предложение GROUP BY, в котором должны быть перечислены все неагрегированные столбцы (ie все столбцы, кроме столбца, который находится внутри GROUP_CONCAT()).

...