0
SELECT a.*,
       (select count(*) from f4s56_itcs_fields c where c.fid=a.id) nbfields,
       (select b.username from f4s56_users b where a.created_by = b.id) username 
FROM f4s56_itcs_forms a 
where a.created_by=326 
   or a.group in(2,3,9)

这里,“a.group”可以是 2 或 3 或 4 或 2,3,4,5,6 等。意思是,组可以是单值或多值。当它是多值时,不会检索数据。如何解决?

4

3 回答 3

1

如果我理解正确,该f4s56_itcs_forms.group列(或a.group别名)是一个字符串类型的列,可以包含单个或多个值:

a.group
-------
1
2
4
2,5
2,3,5,7

如果这是正确的,您将无法对“值列表”中包含的“值列表”进行直接比较检查a.group。但是,您可以使用 MySQL 的FIND_IN_SET()usinga.group作为您正在查看的集合进行单值检查。

例如,假设您要查找具有 in 值2的所有记录a.group

...
WHERE
    FIND_IN_SET(2, a.`group`) > 0

如果您有多个要检查的值,则需要分别添加它们:

...
WHERE
    FIND_IN_SET(2, a.`group`) > 0
    AND FIND_IN_SET(3, a.`group`) > 0
    AND FIND_IN_SET(9, a.`group`) > 0
于 2013-07-31T11:08:48.987 回答
0

与在逗号分隔值中搜索有关

当它是多值时,不会检索数据。

根据 newfurniturey 的回答,您可以使用 find_in_set() 搜索逗号分隔值。

SQLFiddle: http ://sqlfiddle.com/#!2/1f514/1

不幸的是,您需要转换:

  • in(2,3,9)

  • FIND_IN_SET('2', a.'group') > 0 or FIND_IN_SET('3', a.'group') > 0 or FIND_IN_SET('9', a.'group') > 0

产生一个 SQL:

SELECT a.*,
           (select count(*) from f4s56_itcs_fields c where c.fid=a.id) nbfields,
           (select b.username from f4s56_users b where a.created_by = b.id) username 
    FROM f4s56_itcs_forms a 
    where a.created_by=326 
       or FIND_IN_SET('2', a.`group`) > 0
       or FIND_IN_SET('3', a.`group`) > 0
       or FIND_IN_SET('9', a.`group`) > 0;

相关数据:

如果不是上述情况,您的问题可能与数据有关。我已经根据您的查询创建了一个测试模式并返回了结果。

SQLFiddle:http ://sqlfiddle.com/#!2/3763b/1

create table f4s56_itcs_fields
(
  field_id int,
  field_name varchar(20),
  fid int
);

create table f4s56_users
(
  id int,
  username varchar(100)
);

create table f4s56_itcs_forms
(
   id int,
   created_by int, 
   `group` int
);


insert into f4s56_users values (326, 'user_326');
insert into f4s56_users values (327, 'user_327');

insert into f4s56_itcs_fields values (1,'name',1);
insert into f4s56_itcs_fields values (2,'last name',1);
insert into f4s56_itcs_fields values (3,'telephone',1);

insert into f4s56_itcs_forms values (1, 326, 2);
insert into f4s56_itcs_forms values (2, 326, 3);
insert into f4s56_itcs_forms values (2, 326, 9);
于 2013-07-31T11:07:35.783 回答
0

我不确定我是否理解你的查询,但试试这个。

    SELECT a.*,b.username, count(*) from f4s56_itcs_forms a  
    INENR JOIN f4s56_users b
    on  a.created_by = b.id   
    INNER JOIN  f4s56_itcs_fields c
    on c.fid=a.id
    where a.created_by=326 or a.`group` in(2,3,9)

注意:你有我认为列被调用group,所以你应该用这样的反引号来逃避它

      `group`

如果您在一列中存储多个值,那么您可以这样做。

   where a.created_by=326 or FIND_IN_SET(2, a.`group`) > 0
                          or FIND_IN_SET(3, a.`group`) > 0
                          or FIND_IN_SET(9, a.`group`) > 0
于 2013-07-31T10:55:35.360 回答