下面是我的示例数据
hwid: 1502e3c3-b49c-4907-92fd-2ffac2d50ace
ip: 68.197.140.109
character name: none
hwid: 1502e3c3-b49c-4907-92fd-2ffac2d50ace
ip: 219.100.37.236
character name: none
hwid: 1502e3c3-b49c-4907-92fd-2ffac2d50acd
ip: 68.197.140.109
character name: kalgame
现在假设我用这个hwid1502e3c3-b49c-4907-92fd-2ffa2d50ace和这个ip地址219.100.37.236登录
其中有一个链接指向使用以前的 IP
地址 68.197.140.109
然后呢 IP
地址有到第三个地址的链接 hwid
有一个 character name : kalgame
.
这就是我需要做的交叉引用所有 IP's
链接到所有 hwid's
然后检查一下 hwid's
有一个 character_name
. 如果他们有 character_name
与它们相关联的 SELECT DISTINCT COUNT(totalMatchesOfUniqueCharacterNames)
我还要检查一下 current HWID
或者 current IP
您正在使用的有3天试用期,如果有,那么也将其添加到 SELECT DISTINCT COUNT
.. 然后,如果selectdistinct count大于1,我可以很容易地在php中进行检查,然后中止向特定用户提供更多的免费试用,因为他之前已经使用 character_name
,也可能有一个3天的试用期,然后在他的个人电脑上 hwid
或者他的 IP
地址,注意我也要排除空白 character_name's
因为那些玩家还没有使用角色登录。。所以他们不算数。我还得和 locale
这就是他们在玩的游戏如果他们在玩不同的游戏,那么他们也不算。
这是我在交叉引用方面的尝试,我已经为此工作了6个小时,今天是我第一天使用sqlite或任何sql,所以我不知道我在做什么
这是两个表的表架构ddl。。它们也都在同一个数据库文件中。
CREATE TABLE ips (
hwid VARCHAR,
ip VARCHAR,
character_name VARCHAR,
locale VARCHAR,
botver VARCHAR,
reg_time DATETIME,
last_time DATETIME,
ping_count INTEGER DEFAULT 0
);
CREATE TABLE users (
hwid VARCHAR UNIQUE,
timestamp INTEGER,
daysToUse INTEGER,
pcLimit INTEGER,
comment VARCHAR
);
这是我试图把这一切放在一起
SELECT users2.hwid,
ips2.character_name,
ips2.ip
FROM users AS users2
INNER JOIN
ips AS ips2 ON ips2.hwid = users2.hwid
WHERE EXISTS (
SELECT 1
FROM users
INNER JOIN
ips ON ips.hwid = users.hwid
WHERE ips.character_name != '' AND
ips.locale = ips2.locale AND
(ips.hwid = '1502e3c3-b49c-4907-92fd-2ffac2d50ace' OR
ips.ip = '219.100.37.236') AND
EXISTS (
SELECT 1
FROM users
INNER JOIN
ips ON ips.hwid = users.hwid
WHERE ips.character_name != '' AND
ips2.ip = ips.ip AND
ips2.locale = ips.locale
)
)
OR
(ips2.hwid = '1502e3c3-b49c-4907-92fd-2ffac2d50ace' AND
users2.daysToUse = 3) OR
(ips2.ip = '219.100.37.236' AND
users2.daysToUse = 3);
这是我在制作网站上留下的东西。。这不太好。。不做交叉引用,很好地跳过某些列,但至少它有点不同于上面的顶层代码,它听起来应该工作,但根本不工作。
SELECT COUNT(DISTINCT users2.hwid)
FROM users AS users2
INNER JOIN
ips AS ips3 ON ips3.hwid = users2.hwid
WHERE ips3.character_name = (
SELECT ips.character_name
FROM users,
ips AS ips2
INNER JOIN
ips ON ips.hwid = users.hwid
WHERE ips.character_name != '' AND
ips.locale = ips2.locale AND
(ips.hwid = '$HWID' OR
ips.ip = '$IP')
)
OR
(ips3.hwid = '$HWID' AND
users2.daysToUse = 3) OR
(ips3.ip = '$IP' AND
users2.daysToUse = 3);
如果有人能帮我,我将永远感激
2条答案
按热度按时间cyvaqqii1#
因为您的子查询共享相同的
FROM
以及JOIN
从句,简化为紧凑WHERE
条款:dba5bblo2#
我自己解决的。。事实证明,这是非常简单的,我只是让查询做了向后的顺序,我翻转了顺序,砰的一声,它的预期工作。
区域设置问题很难解决。。我无法检测当前使用的区域设置,因此我使用
ips.lasttime
哪个显示哪个IP
或者HWID
最后一次使用,最后一次使用显然是我要检查的区域设置最终结果