我有两张桌子。一个是engine4_users,另一个是engine4_user_fields_values。 engine4_users表包含id, email, password,displayname。它与one to many表具有engine4_user_fields_values关系。 engine4_user_fields_values表看起来像其中item_id是users表的user_id。现在您可以看到,在此表中,field_id也可以针对一个项目ID具有许多值。现在,我想以某种方式从这两个表中选择数据,有时我需要value列的值,有时我需要将value列放在基于field_id的条件下。例如看我的查询SELECT`eu`.`user_id`, `eu`.`displayname`,GROUP_CONCAT( CASE WHEN eufv.field_id = 19 THEN eufv.value END ) AS city, GROUP_CONCAT( CASE WHEN eufv.field_id = 15 THEN eufv.value END )AS interestsFROM `engine4_users` AS `eu` INNER JOIN `engine4_user_fields_values` AS `eufv` ON eu.user_id = eufv.item_id WHERE (eu.username LIKE '%hameed%' OR eu.email LIKE '%hameed%' OR eu.displayname LIKE '%hameed%') GROUP BY`eu`.`user_id`;此查询按用户获取数据组,并以逗号分隔获取field_id 15和16的值。现在,我想在第二个表上放置更多条件,以过滤出结果。例如,我想将条件设置为该人的年龄处于某个范围内的生日,即field_id 6,并将field_id 5设置为值是3的位置。但是当我输入以下查询时SELECT`eu`.`user_id`, `eu`.`displayname`,GROUP_CONCAT( CASE WHEN eufv.field_id = 19 THEN eufv.value END ) AS city, GROUP_CONCAT( CASE WHEN eufv.field_id = 15 THEN eufv.value END )AS interests FROM `engine4_users` AS `eu` INNER JOIN `engine4_user_fields_values` AS `eufv` ON eu.user_id = eufv.item_id WHERE (eu.username LIKE '%hameed%' OR eu.email LIKE '%hameed%' OR eu.displayname LIKE '%hameed%') AND (FLOOR(DATEDIFF(CURDATE(),CASE WHEN eufv.field_id = 6 THEN eufv.`value` END ) / 365) >= '20') AND (FLOOR(DATEDIFF(CURDATE(),CASE WHEN eufv.field_id = 6 THEN eufv.`value` END ) / 365) <= '29') GROUP BY`eu`.`user_id`;该查询给出结果,但是在这种情况下,我没有获得列city和interest的值。它们在结果集中为空。如果我在where子句中再添加一个条件AND ((CASE WHEN eufv.field_id = 5 THEN eufv.`value` END) = '3')很好,并与记录对应。但是在这种情况下,结果集为空。我已经尽力解释了我的问题。因此,请指导我如何编写此查询,或者如果我无法传达我的问题,请告诉我。最好的祝福 最佳答案 首先:您正在使用CASE WHEN而不使用ELSE。因此,例如,对于所有eufv.field_id 6,以下条件均为false,因为CASE的计算结果为NULL,而不是> = 20。(FLOOR(DATEDIFF(CURDATE(),CASE WHEN eufv.field_id = 6 THEN eufv.`value` END ) / 365) >= '20')AND其次:当然,在缩小标准范围时,您获得的记录会更少。也许您希望所有engine4_users并仅在满足条件时才添加engine4_user_fields_values中的数据?那将是一个外部联接:FROM `engine4_users` AS `eu`LEFT JOIN `engine4_user_fields_values` AS `eufv`ON eu.user_id = eufv.item_id AND (FLOOR(DATEDIFF(CURDATE(),CASE WHEN eufv.field_id = 6 THEN eufv.`value` END ) / 365) >= '20') ...WHERE (eu.username LIKE '%hameed%' OR eu.email LIKE '%hameed%' OR eu.displayname LIKE '%hameed%')在进行外部联接时,请确保在ON子句中而不是WHERE子句中具有表ne4_user_fields_values的所有条件。 08-03 18:22