我有一个表member1,看起来像这样。我正在编辑我的表,为什么我要从pst返回所有值。
id club_id mobile pst
1 1 9437054788 6
2 1 9437345602 NULL
3 2 9437056738 35
4 2 9437064876 39
5 1 9437059927 NULL
6 2 9437965276 40
7 1 9437121455 NULL
我有一个用于club_id的下拉字段和另一个用于pst的复选框字段,其值为'选择全部'在这两个领域。 '选择全部'等于'%'。
@TheConstructor提供的解决方案在此查询中运行良好
SELECT group_concat(mobile) FROM `member1` WHERE COALESCE(pst, '')
LIKE '%' and club_id=1
或
SELECT group_concat(mobile) FROM `member1` WHERE COALESCE(pst, '')
LIKE '6' and club_id=1
现在我想在查询中使用多个值来代替' 6'例如
SELECT group_concat(mobile) FROM `member1` WHERE COALESCE(pst, '')
in (6,35,39,40) or in ('%') and club_id=1
我如何才能实现这一目标,因为目前我只能通过一个值返回结果,即6或35或39或40
答案 0 :(得分:2)
您将注意到NULL LIKE '%'
将不会评估为TRUE
,而pst
为NULL
的行将从结果中排除。现在有一种不同的方法来包含pst
为NULL
的行;这里有三个:
如果您想要获取所有行,您可以将WHERE
全部放在一起。
SELECT group_concat(mobile) FROM `member1`;
如果您想要始终加入NULL
,可以添加OR pst IS NULL
。 (可以使用列pst
上的索引)
SELECT group_concat(mobile) FROM `member1` WHERE pst LIKE '%' OR pst IS NULL;
如果您打算将LIKE '%'
更改为另一个谓词,这可能是较大表上最快的SQL。
如果您想将NULL
视为空字符串,您可以使用:(不会在列pst
上使用索引)
SELECT group_concat(mobile) FROM `member1` WHERE COALESCE(pst, '') LIKE '%'
如果pst为pst
, COALESCE(pst, '')
将在NULL
列中提供值,如果pst为''
则为NULL
。
虽然我认为这是最灵活的,因为你只需要将'%'
更改为不同的东西来开始过滤并排除NULL
- 值,MySQL的优化器将遗憾地处理这个与第二个不同查询将使您在pst
具有索引的大表上花费您的性能。
最后一点需要注意,GROUP_CONCAT
默认只返回1024个字符。这可以通过将group_concat_max_len设置为更高的值来更改。
答案 1 :(得分:1)
如果我误解了你的问题,请原谅我,但我认为你只想:
SELECT group_concat(mobile) FROM member1
%
中的WHERE pst LIKE '%'
是任意字符零或更多的通配符,因此查询将返回任何NOT NULL
pst记录..您最好使用{{1}如果你需要那个逻辑。
如果你需要检查实际的角色WHERE pst IS NOT NULL
,你需要逃脱它; %
..但这与WHERE pst LIKE '\%'
的逻辑相同,因为您正在检查是否相等。
我仍然在努力了解你,但如果你在移动电话号码数据库中检查是否存在,最简单的查询是:
WHERE pst = '%'
SELECT 1 FROM member1 WHERE mobile = ?
,你的传递变量和返回的任何行意味着记录存在。确保使用SQL注入安全的绑定方法。
除了我将数据显示为CSV之外,我还会回避在每种情况下都使用?
。如果要从结果中构建一个下拉列表,只需拉入数组中的单独行,然后在构建HTML时运行它。
答案 2 :(得分:0)
您似乎正在从表单数据中使用该值。 您确定这不会导致安全问题吗?
我会从$ _POST获取值,测试它,根据测试创建一个具有正确WHERE部分查询的变量,并在查询字符串中使用它。