Идентификатор столбца MySQL в IN / ALL / ANY подзапросе неоднозначен - PullRequest
0 голосов
/ 24 декабря 2018

Я пытаюсь выполнить функции поиска, включающие три таблицы.

Поиск пользователей и возврат туда, где идентификатор пользователя 1 является другом вернувшихся пользователей.Также Возвращенные пользователи фильтруются из третьей таблицы, где он проверяет тег этих пользователей.

Итак, я могу сказать: «Верните пользователей, у которых есть тег 'Programming', 'Php' в userinterests table, а также, если возвращенный пользователь является другом usr id 1 или нет»

Я пытаюсьиспользуйте приведенный ниже запрос, но получайте Column 'id' in IN/ALL/ANY subquery is ambiguous Если я удалю левое соединение, тогда оно будет работать.

SELECT n.id, n.firstName, n.lastName, t.id, t.tag, t.user_id, if(id in (
        SELECT u.id as id from friends f, users u 
        WHERE CASE 
        WHEN f.following_id=1
        THEN f.follower_id = u.id 
        WHEN f.follower_id=1
        THEN f.following_id = u.id
        END 
        AND
        f.status= 2
    ), "Yes", "No") as isFriend 
FROM users n
LEFT JOIN userinterests t on  n.id = t.id

WHERE t.tag in ('Programming', 'Php')

Спасибо, что уделили время:)

Ответы [ 2 ]

0 голосов
/ 24 декабря 2018

Я буду придерживаться вашего подхода:

1) Я использовал INNER JOIN вместо LEFT JOIN для пропуска пользователей, не связанных с тегами: Programming и Php.

2) Я заменил логику, чтобы найти набор друзей, связанных с пользователем, с id, равным 1.

SELECT
    n.id,
    n.firstName,
    n.lastName,
    t.id,
    t.tag,
    t.user_id,
    IF(
        n.id IN (SELECT follower_id FROM friends WHERE status = 2 AND following_id = 1
                 UNION
                 SELECT following_id FROM friends WHERE status = 2 AND follower_id = 1),
        "Yes",
        "No"
    ) AS isFriend
FROM
    users n
INNER JOIN
    userinterests t ON n.id = t.id AND t.tag IN ('Programming', 'Php')

Просто любопытно, в чем смысл status = 2?

0 голосов
/ 24 декабря 2018

Укажите все имена ваших столбцов.Вы, кажется, знаете это, потому что все другие имена столбцов являются правильными.

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

SELECT . . . 
       (CASE WHEN n.id IN (SELECT u.id as id 
                           FROM friends f CROSS JOIN
                                users u 
                           WHERE CASE WHEN f.following_id=1
                                      THEN f.follower_id = u.id 
                                      WHEN f.follower_id=1
                                      THEN f.following_id = u.id
                                 END 
                           ) AND
                 f.status= 2
             THEN 'Yes' ELSE 'No'
        END) as isFriend 
. . . 
...