SQL-запрос - выбор нескольких записей, которые соответствуют определенному идентификатору - PullRequest
0 голосов
/ 19 июля 2011

Я не уверен, как это объяснить, и я не использую SQL .. это мой запрос, который не работает

select * from ao_addrcodes 
JOIN a1_addrs on a1_addrid = ao_addrid left Join a2_name on a2_addrid = ao_addrid 
where ao_codeid = 'DJ' and 'E' and 'A'

Попытка получить список людей, которые находятся в таблице ao_addrid и их ao_codeid - 'DJ' и 'E' и 'A'

Значит, Фред будет в таблице 3 раза. Его a2_addrid будет таким же, но его ao_codeid будет другим

Каждый человек имеет несколько записей, если у него есть несколько ao_codeid '

помощь

EDIT

ao_codeid, a2_addrid

'DJ', '525'
'E', '525'
'A', '525'
'DJ', '52'
'A', '25'
'E', '25'

Так что из приведенных выше данных я бы хотел видеть только пользователя 525. Не 52 или 25.

Я использую MySQL

Ответы [ 5 ]

1 голос
/ 19 июля 2011

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

Я думаю, что самый простой способ сделать то, что вы хотите, это:

SELECT * 
FROM a2_name
WHERE EXISTS (
  SELECT COUNT(DISTINCT ao_codeid) FROM ao_addrcodes 
    JOIN a1_addrs on a1_addrid = ao_addrid
    LEFT JOIN a2_name on a2_addrid = ao_addrid 
  WHERE ao_codeid IN ('DJ', 'E', 'A') AND a2_addrid = ao_addrid
  HAVING COUNT(DISTINCT ao_codeid) = 3
)

Или чтобы быть менее сложным и все еще делать то, что вы хотите (но я не уверен, какие поля вы хотите вернуть, просто замените a2_name.name на список всех полей, которые вы хотите вернуть, поскольку ваша схема не указана:

SELECT a2_name.name 
FROM ao_addrcodes 
  JOIN a1_addrs on a1_addrid = ao_addrid
  LEFT JOIN a2_name on a2_addrid = ao_addrid 
WHERE ao_codeid IN ('DJ', 'E', 'A')
GROUP BY a2_name.name
HAVING COUNT(DISTINCT ao_codeid) = 3
1 голос
/ 19 июля 2011

Если вы используете SQL Server, то ваш оператор WHERE неверен:

SELECT    *
FROM      ao_addrcodes
JOIN      a1_addrs ON a1_addrid = ao_addrid
LEFT JOIN a2_name ON a2_addrid = ao_addrid 
WHERE     ao_codeid IN('DJ', 'E', 'A')

Или вы можете сделать это следующим образом

WHERE     ao_codeid = 'DJ'
OR        ao_codeid = 'E'
OR        ao_codeid = 'A'

РЕДАКТИРОВАТЬ 1

Я хотел бы сделать что-то вроде этого:

--Create a CTE that counts eligible records
WITH CodeCount AS
(
    SELECT    ID, --this represents your 525 data
              COUNT(*) AS CodeCount
    FROM      [your table]
    WHERE     code IN('DJ', 'E', 'A')
    GROUP BY  ID
)

SELECT        *
FROM          [your table]
INNER JOIN    CodeCount ON [your table].ID = CodeCount.ID
WHERE         CodeCount = 3

РЕДАКТИРОВАТЬ 2

Поскольку вы отредактировали свой пост, чтобы сказать, что вы используете MySQL,это было бы мое решение:

SELECT    *
FROM      ao_addrcodes
JOIN      a1_addrs ON a1_addrid = ao_addrid
LEFT JOIN a2_name ON a2_addrid = ao_addrid
INNER JOIN (
                SELECT       ID,
                COUNT(*) AS  EligibleCount
                FROM         ao_addrcodes
                WHERE        ao_codeid IN('DJ', 'E', 'A')
                GROUP BY     ID
            ) a ON a.ID = ao_addrcodes.ID
WHERE         a.EligibleCount = 3
0 голосов
/ 19 июля 2011

ИЛИ найти записи DJ, а затем проверить, что другие 2 существуют?

SELECT * FROM ao_addrcodes a 
JOIN a1_addrs ON a1_addrid = a.ao_addrid 
LEFT JOIN a2_name ON a2_addrid = a.ao_addrid 
 WHERE ao_codeid = 'DJ' 
 AND EXISTS (SELECT * FROM ao_addrcodes x WHERE ao_codeid = 'E' and x.ao_addrid= a.ao_addrid)  AND 
 AND EXISTS (SELECT * FROM ao_addrcodes x WHERE ao_codeid = 'A' and x.ao_addrid= a.ao_addrid)

ПРИМЕЧАНИЕ. Другие основанные на подсчете решения будут работать ТОЛЬКО при наличии уникального ограничения для ao_addrid & ao_codeid.

0 голосов
/ 19 июля 2011

Попытка получить список людей, которые находятся в таблице ao_addrid и их ao_codeid это 'DJ' и 'E' и 'A'

Ваше предложение where использует AND, где должно использоваться OR, на IN, если я понял ваш вопрос, который не очень четко сформулирован.

              where ao_codeid in ('DJ','E','A')

При работе с SQL вы должны очень внимательно относиться к своим AND и своим OR, когда вы пытаетесь определить проблему на повседневном английском (или на любом другом естественном языке, на котором вы говорите), прежде чем переводить это в запрос.

0 голосов
/ 19 июля 2011
where ao_codeid = 'DJ' OR ao_codeid = 'E' OR ao_codeid = 'A'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...