Mysql 如果表列中没有重叠,请使用标准值
我有一个表ce_关系和一个表ce_值,我想将它们组合成一个表ce_组合值。ce_组合_值表的行数应与ce_关系的行数完全相同。但是,下面所述的查询只返回ce_values.user_id列中存在user_id和friend_id的行。我试图通过使用IFNULL语句来解决这个问题,但我想WHERE子句中还缺少一个额外的条件。。。欢迎任何帮助Mysql 如果表列中没有重叠,请使用标准值,mysql,sql,Mysql,Sql,我有一个表ce_关系和一个表ce_值,我想将它们组合成一个表ce_组合值。ce_组合_值表的行数应与ce_关系的行数完全相同。但是,下面所述的查询只返回ce_values.user_id列中存在user_id和friend_id的行。我试图通过使用IFNULL语句来解决这个问题,但我想WHERE子句中还缺少一个额外的条件。。。欢迎任何帮助 INSERT INTO ce_combined_values (user_id, friend_id, relation_degree, user_value
INSERT INTO ce_combined_values (user_id, friend_id, relation_degree, user_value, friend_value, relation_value)
SELECT a.user_id, a.friend_id, a.relation_degree, IFNULL(b.1d_value, 0) as user_value, IFNULL(c.1d_value, 0) as friend_value, Least(b.1d_value, c.1d_value) as relation_value
FROM ce_relations a, ce_values b, ce_values c
WHERE a.relation_degree = 1 AND b.user_id = a.user_id AND c.user_id = a.friend_id AND b.user_id <> c.user_id
Union all
//same select query is used for relation_degree 2 with 2d_values and relation_degree 3 with 3d_values.
表ce_值:
+---------+----------+----------+----------+
| user_id | 1d_value | 2d_value | 3d_value |
+---------+----------+----------+----------+
| 1 | 5 | 10 | 33 |
| 2 | 10 | 12 | 44 |
| 3 | 20 | 13 | 55 |
+---------+----------+----------+----------+
应成为ce_组合值删除关系_度和关系_值以提高可读性
+---------+-----------+------------+--------------+
| user_id | friend_id | user_value | friend_value |
+---------+-----------+------------+--------------+
| 1 | 3 | 5 | 20 |
| 2 | 1 | 10 | 5 |
| 3 | 4 | 20 | 0 |
+---------+-----------+------------+--------------+
但是当前返回的friend_id=4的行丢失,因为它在ce_值中不存在
+---------+-----------+------------+--------------+
| user_id | friend_id | user_value | friend_value |
+---------+-----------+------------+--------------+
| 1 | 3 | 5 | 20 |
| 2 | 1 | 10 | 5 |
+---------+-----------+------------+--------------+
如果我正确理解您的问题,您需要左键联接表。我不认为您需要使用不同的过滤条件将所有相同的查询合并三次 也许这对你有帮助:
SELECT a.user_id, a.friend_id, a.relation_degree,
IFNULL(b.value, 0) as user_value,
IFNULL(c.value, 0) as friend_value,
Least(b.value, c.value) as relation_value
FROM ce_relations a
LEFT
JOIN ce_values b
ON a.user_id = b.user_id
LEFT
JOIN ce_values c
ON a.friend_id = c.user_id
AND b.user_id <> c.user_id
WHERE a.relation_degree IN (1, 2, 3)
ce_组合_值表的行数应与ce_关系的行数完全相同。但是,下面所述的查询只返回ce_values.user_id列中存在user_id和friend_id的行,不清楚您要实现什么。你能举个例子吗?不清楚你需要什么样的输出。如果您使用的是UNION ALL,则输出将是第一个表中的行数+下一个表中的行数。我不确定,但听起来好像您想要左连接感谢您的快速响应!我在编辑中添加了一个示例。感谢您的快速响应!不幸的是,我不太清楚。左连接没有帮助,因为我需要每个关系度的不同列的值。阶数为1的ce_值.1d_值,阶数为2的ce_值.2d_值,阶数为3的ce_值.3d_值,但我可以对每个阶数执行左连接,然后将它们合并…我现在可以工作了。谢谢你打了我一巴掌!
SELECT a.user_id, a.friend_id, a.relation_degree,
IFNULL(b.value, 0) as user_value,
IFNULL(c.value, 0) as friend_value,
Least(b.value, c.value) as relation_value
FROM ce_relations a
LEFT
JOIN ce_values b
ON a.user_id = b.user_id
LEFT
JOIN ce_values c
ON a.friend_id = c.user_id
AND b.user_id <> c.user_id
WHERE a.relation_degree IN (1, 2, 3)