Подзапрос SQL пустой возврат - PullRequest
4 голосов
/ 26 января 2012

Извините за название, но я не нашел лучшего. Моя проблема заключается в следующем: Я хочу выбрать все поля из таблицы "log", где поле "user" равно "user1" или "user2" в "friendships". Мой запрос выглядит так, но возвращает нулевое значение:

    SELECT * FROM `log` 
    WHERE `user` = ANY(SELECT `user1` FROM `friendships` 
                       WHERE (`user1` = 1 OR `user2` = 1) AND `active` = 1) 
    OR `user` = ANY(SELECT `user2` FROM `friendships` 
                    WHERE (`user1` = 1 OR `user2` = 1) AND `active` = 1) 
    GROUP BY `arguments` 
    ORDER BY `created` DESC

Если я использовал только один подзапрос, он работает, но мне нужно и второе поле. И есть больше значений (вот почему я использую подзапросы с ЛЮБОЙ, а не с JOIN). Я надеюсь, что кто-то найдет мою ошибку:).

Ответы [ 3 ]

3 голосов
/ 26 января 2012

Я надеюсь, что это работает:

SELECT *
FROM `log` INNER JOIN `friendships` on
    `log`.`user` = `friendships`.`user`
WHERE `friendships`.`user` in (1,2)
            AND
      `friendships`.`active` = 1
ORDER BY `created` DESC

PS: Можно опубликовать схему (или структуру ) вашей таблицы?

ОБНОВЛЕНИЕ 1

SELECT *
FROM
(
    SELECT *
    FROM `log` INNER `friendships` on
        `log`.`user` = `friendships`.`user1`
    WHERE `friendships`.`user1` in (1,2) 
            AND
          `friendships`.`active` = 1
    UNION
    SELECT *
    FROM `log` INNER `friendships` on
        `log`.`user` = `friendships`.`user2`
    WHERE `friendships`.`user2` in (1,2) 
            AND
          `friendships`.`active` = 1
) as iTable
ORDER BY iTable.`created` DESC
1 голос
/ 26 января 2012

Измените ИЛИ в единый список, используя объединение:

select * 
from `log` 
where `user` in (
    select user1
    from friendships 
    where user1 in (1, 2) and active)
    union
    select user2
    from friendships 
    where `user1` in (1, 2) and active
)
group by arguments
order by `created` desc

или используйте объединение в стандартном соединении

select * from (
select l.* 
from `log` l
join friendships f on l.user = f.user1 and f.user1 in (1, 2) and f.active
union
select l.* 
from `log` l
join friendships f on l.user = f.user2 and f.user2 in (1, 2) and f.active
) x
group by arguments
order by `created` desc
1 голос
/ 26 января 2012

Возможно, я бы попробовал другой подход, возможно, что-то вроде этого:

SELECT *
FROM `log`
WHERE `user` IN (
  SELECT `user1` FROM `friendships` WHERE `user2` = @user AND `active` = 1

  UNION ALL

  SELECT `user2` FROM `friendships` WHERE `user1` = @user AND `active` = 1

  UNION ALL

  SELECT @user
)
GROUP BY
  `arguments`
ORDER BY
  `created` DESC

Хотя, по правде говоря, я бы не стал выбирать столбцы, которые не объединяются и не включаются в GROUP BY в запросе, подобном этому, даже если MySQL позволит мне это сделать.

Другая альтернатива:

SELECT *
FROM `log`
WHERE `user` IN (
  SELECT
    CASE `user1` WHEN @user THEN `user2` ELSE `user1` END AS `user`
  FROM `friendships`
  WHERE (`user1` = @user OR `user2` = @user) AND `active` = 1

  UNION ALL

  SELECT @user
)
GROUP BY
  `arguments`
ORDER BY
  `created` DESC
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...