Sql 在自身内部使用自己的结果的查询
Sql query that uses its own result within itself
对于我试图在 mysql 中编写的此查询,我们将不胜感激。我有两个 table:
files (id, name, subject, size, day, hour, username) and
friendships (user1, user2).
我想从 table files
select 10 most recent
行(根据 id),其中每行的 username
都存在在 table friendships
中,friendships
的 second column
等于某些 name 'x'
.
我正在尝试使用这个语句:
SELECT name,
subject,
size,
day,
hour,
username
FROM files
WHERE username IN ((SELECT user1
FROM friendships
WHERE user2 = 'x')
UNION ALL
(SELECT user2
FROM friendships
WHERE user1 = 'x'))
ORDER BY id DESC
LIMIT 10;
但是,我得到一个错误。这有什么问题,有没有更好的方法?
试着去掉牙套。
SELECT name,
subject,
size,
day,
hour,
username
FROM files
WHERE username IN (SELECT user1
FROM friendships
WHERE user2 = 'x'
UNION ALL
SELECT user2
FROM friendships
WHERE user1 = 'x')
ORDER BY id DESC
LIMIT 10;
我不确定是什么导致了您的错误,但有更好的方法。将其拆分为两个操作。我通常使用 exists
(尽管 in
可能没问题):
WHERE EXISTS (SELECT 1 FROM friendships fs WHERE fs.user2 = 'x' and fs.user1 = files.username) OR
EXISTS (SELECT 1 FROM friendships fs WHERE fs.user1 = 'x' and fs.user2 = files.username)
此公式将允许查询更好地利用索引,特别是在 friendships(user1, user2)
和 friendships(user2, user1)
上(是的,在这种情况下两者都是可取的)。
对于我试图在 mysql 中编写的此查询,我们将不胜感激。我有两个 table:
files (id, name, subject, size, day, hour, username) and
friendships (user1, user2).
我想从 table files
select 10 most recent
行(根据 id),其中每行的 username
都存在在 table friendships
中,friendships
的 second column
等于某些 name 'x'
.
我正在尝试使用这个语句:
SELECT name,
subject,
size,
day,
hour,
username
FROM files
WHERE username IN ((SELECT user1
FROM friendships
WHERE user2 = 'x')
UNION ALL
(SELECT user2
FROM friendships
WHERE user1 = 'x'))
ORDER BY id DESC
LIMIT 10;
但是,我得到一个错误。这有什么问题,有没有更好的方法?
试着去掉牙套。
SELECT name,
subject,
size,
day,
hour,
username
FROM files
WHERE username IN (SELECT user1
FROM friendships
WHERE user2 = 'x'
UNION ALL
SELECT user2
FROM friendships
WHERE user1 = 'x')
ORDER BY id DESC
LIMIT 10;
我不确定是什么导致了您的错误,但有更好的方法。将其拆分为两个操作。我通常使用 exists
(尽管 in
可能没问题):
WHERE EXISTS (SELECT 1 FROM friendships fs WHERE fs.user2 = 'x' and fs.user1 = files.username) OR
EXISTS (SELECT 1 FROM friendships fs WHERE fs.user1 = 'x' and fs.user2 = files.username)
此公式将允许查询更好地利用索引,特别是在 friendships(user1, user2)
和 friendships(user2, user1)
上(是的,在这种情况下两者都是可取的)。