好了,这就是我所说的 '黑客',而不是normall数据库查询,我会disrecommend得到的位置,你必须首先处理。正确的方法来处理的项目清单这样是为了让应用程序的语言解析它变成一个漂亮的列表,你可以用它来建立一个正常的,常规的SQL列表中,像这样:
TUser.Name IN ('Name1', 'Name2',...., 'NameX')
但无论如何,如果你想坚持原来的问题,你的数据库是MySQL,你可以做一个远程理智的方式在这样一个查询:
SET @UserNames := 'Alpha,Beta,Gama';
SELECT TUser.Name
, TAccount.Name
FROM TUser
INNER JOIN TUserAccount
ON TUser.ID = TUserAccount.UserID
INNER JOIN TAccount
ON TUserAccount.AccountID = TAccount.ID
WHERE FIND_IN_SET(TUser.Name, @UserNames)
OR (SELECT COUNT(*)
FROM TUser.Name
WHERE FIND_IN_SET(TUser.Name, @UserNames)) = 0
请注意,我也有所改变输入数据 - 这不是我在逗号后面没有空格。如果这是不可接受的,只需将查询中的每个出现@UserNames
更改为REPLACE(@UserNames, ', ', ',')
即可。同时请注意,它的性能下降,因为不可能使用TUser.Name上的任何索引来过滤特定用户。
我已经提到你真的应该做一个适当的IN
你的数据列表。你可以在SQL如此直接做太多(动态SQL):
SET @UserNames := 'Alpha, Beta, Gama';
SET @stmt := CONCAT(
' SELECT TUser.Name'
,' , TAccount.Name'
,' FROM TUser'
,' INNER JOIN TUserAccount'
,' ON TUser.ID = TUserAccount.UserID'
,' INNER JOIN TAccount'
,' ON TUserAccount.AccountID = TAccount.ID'
,' WHERE TUser.Name IN (''', REPLACE(@UserNames, ', ', ''',''') , ''')'
,' OR (SELECT COUNT(*) '
,' FROM TUser.Name'
,' WHERE TUser.Name IN (''', REPLACE(@UserNames, ', ', ''',''') , ''')) = 0'
)
PREPARE stmt FROM @stmt;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
(注意,在这种情况下,我可以使用的用户名列表与空间不变)
不返回只有匹配的名字在那种情况下 – 2010-01-17 22:00:46
是的,我刚刚注意到,试图找出一个快速解决之前,我关闭了答案。 – William 2010-01-17 22:01:20
IN @UserNames在这里不起作用。 @UserNames是“Alpha,Beta,Gama”,所以你的代码相当于说出名字在哪里(“Alpha,Beta,Gama”),但他想要在哪里(“Alpha”,“Beta”,“Gama” ) - 注意报价位置的差异。 – dcp 2010-01-17 22:01:26