Mysql 如果表列中没有重叠,请使用标准值

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

我有一个表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, 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)