如果 LEFT OUTER JOIN 表包含列中的值,则 mySQL 条件

问题描述 投票:0回答:2

我有两个数据库表:一张包含用户 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

mysql left-join
2个回答
0
投票

试试这个。我使用子查询、联合和查询中的查询。

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

0
投票

感谢@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
© www.soinside.com 2019 - 2024. All rights reserved.