我有两个数据库表:一张包含用户 ID,一张包含用户元数据(多行与同一用户 ID 相关)。
users
表结构示例
id | 用户名 |
---|---|
1 | 用户1 |
2 | 用户2 |
3 | 用户3 |
users_meta
数据结构示例
元_id | 用户ID | 元键 | 元值 |
---|---|---|---|
1 | 1 | 键1 | a |
2 | 1 | 键2 | b |
3 | 2 | 键1 | d |
4 | 3 | 键1 | e |
5 | 3 | 键2 | f |
我想查询用户是否拥有元数据数据库行。
SELECT * FROM users
LEFT OUTER JOIN users_meta ON users.id = users_meta.user_id
WHERE users_meta.meta_key != "key2"
GROUP BY id
ORDER BY id ASC
LIMIT 0, 100
如何查询以获取没有与
2
相关的元值的用户 id key2
?
试试这个。我使用子查询、联合和查询中的查询。
SELECT * FROM
(
SELECT
(SELECT users_meta.id FROM users_meta WHERE users_meta.user_id = users.id AND users_meta.meta_key = 'key1') AS meta_id,
users.id AS user_id,
users.username,
'key1' AS meta_key,
(SELECT users_meta.meta_val FROM users_meta WHERE users_meta.user_id = users.id AND users_meta.meta_key = 'key1') AS meta_val
FROM
users
UNION ALL
SELECT
(SELECT users_meta.id FROM users_meta WHERE users_meta.user_id = users.id AND users_meta.meta_key = 'key2') AS meta_id,
users.id AS user_id,
users.username,
'key2' AS meta_key,
(SELECT users_meta.meta_val FROM users_meta WHERE users_meta.user_id = users.id AND users_meta.meta_key = 'key2') AS meta_val
FROM
users
) AS SRC
WHERE
meta_val IS NULL
ORDER BY
user_id
感谢@Kukuh Gumilang 的回复,它让我走上了正确的道路,可以编写更短、更好的查询,完美地适应我的复杂框架。
解决方案实际上就像添加新连接和条件一样简单
SELECT id, username FROM users
LEFT OUTER JOIN users_meta as ume ON users.id = ume.user_id AND ume.meta_key = 'meta-key-to-check'
LEFT OUTER JOIN users_meta as um0 ON users.id = um0.user_id
WHERE
(um0.meta_val = 'meta1' AND um0.meta_value IN ('val1', 'val2')) AND
AND ume.meta_val IS NULL /* or NOT NULL to check for existing metas */
GROUP BY id
ORDER BY id ASC
LIMIT 0, 100