SQLite3 with PHP 如何使用在其他列中找到的数据对列进行交叉引用
SQLite3 with PHP How to do Cross Referencing of Columns with data found in other Columns
这是我的示例数据的样子
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
现在假设我正在登录
这个hwid
1502e3c3-b49c-4907-92fd-2ffac2d50ace
这个IP地址
219.100.37.236
其中有一个 link 到使用 68.197.140.109
的先前 IP
地址
那个 IP
地址有一个 link 到第三个 hwid
有一个 character name : kalgame
.
这就是我需要对所有 IP's
link 和所有 hwid's
进行交叉引用,然后检查这些 hwid's
中是否有 [=25] =].
如果他们有一个 character_name
关联到他们 return 他们在 SELECT DISTINCT COUNT(totalMatchesOfUniqueCharacterNames)
我还需要检查您使用的 current HWID
或 current IP
是否有 3 天的试用期,如果有则也将其添加到 SELECT DISTINCT COUNT
.. 然后我如果 SELECT DISTINCT COUNT 大于 1,可以轻松签入 PHP,然后中止向特定用户提供更多免费试用,因为他之前已经使用 character_name
登录,并且可能在他的 PC hwid
或他的 IP
地址上有 3 天的试用期,请注意我还想排除空白 character_name's
因为那些玩家没有使用角色登录然而..所以他们不算数。我还必须匹配 locale
,即他们在玩哪个游戏,如果他们玩的是不同的游戏,那么他们也不算数。
这是我尝试交叉引用的尝试我已经为此工作了 6 个小时,今天是我第一天使用 SQLite 或任何 SQL,所以我不知道我在做什么我在做
这是我的 table 两个 table 的模式 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);
如果有人能帮助我,我将永远感激 :D
我自己解决了。事实证明这样做很简单,我只是按倒序完成查询我翻转了顺序然后 bam 它按预期工作。
语言环境问题很棘手。我无法检测到当前使用的是哪个语言环境,所以我继续使用 ips.lasttime
,它显示最后使用了哪个 IP
或 HWID
,最后使用它显然是我要检查的语言环境
最终结果
SELECT ips.ip,
ips.character_name,
users.hwid,
users.daysToUse,
ips.locale
FROM users
INNER JOIN
ips ON ips.hwid = users.hwid
WHERE ips.ip IN (
SELECT ips.ip
FROM users
INNER JOIN
ips ON ips.hwid = users.hwid
WHERE (ips.hwid = '1502e3c3-b49c-4907-92fd-2ffac2d50ace' AND
users.daysToUse = 3) OR
(ips.ip = '219.100.37.236' AND
users.daysToUse = 3)
)
AND
ips.locale = (
SELECT ips.locale
FROM users
INNER JOIN
ips ON ips.hwid = users.hwid
WHERE (ips.hwid = '1502e3c3-b49c-4907-92fd-2ffac2d50ace' AND
users.daysToUse = 3) OR
(ips.ip = '219.100.37.236' AND
users.daysToUse = 3) ORDER BY ips.last_time ASC
);
由于您的子查询共享相同的 FROM
和 JOIN
子句,因此简化为紧凑的 WHERE
子句:
SELECT i.ip, i.character_name, u.hwid, u.daysToUse, i.locale
FROM users u
INNER JOIN ips i
ON i.hwid = u.hwid
WHERE (i.hwid = '1502e3c3-b49c-4907-92fd-2ffac2d50ace'
AND u.daysToUse = 3)
OR (i.ip = '219.100.37.236' AND u.daysToUse = 3)
ORDER BY i.last_time
这是我的示例数据的样子
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
现在假设我正在登录 这个hwid 1502e3c3-b49c-4907-92fd-2ffac2d50ace 这个IP地址 219.100.37.236
其中有一个 link 到使用 68.197.140.109
的先前 IP
地址
那个 IP
地址有一个 link 到第三个 hwid
有一个 character name : kalgame
.
这就是我需要对所有 IP's
link 和所有 hwid's
进行交叉引用,然后检查这些 hwid's
中是否有 [=25] =].
如果他们有一个 character_name
关联到他们 return 他们在 SELECT DISTINCT COUNT(totalMatchesOfUniqueCharacterNames)
我还需要检查您使用的 current HWID
或 current IP
是否有 3 天的试用期,如果有则也将其添加到 SELECT DISTINCT COUNT
.. 然后我如果 SELECT DISTINCT COUNT 大于 1,可以轻松签入 PHP,然后中止向特定用户提供更多免费试用,因为他之前已经使用 character_name
登录,并且可能在他的 PC hwid
或他的 IP
地址上有 3 天的试用期,请注意我还想排除空白 character_name's
因为那些玩家没有使用角色登录然而..所以他们不算数。我还必须匹配 locale
,即他们在玩哪个游戏,如果他们玩的是不同的游戏,那么他们也不算数。
这是我尝试交叉引用的尝试我已经为此工作了 6 个小时,今天是我第一天使用 SQLite 或任何 SQL,所以我不知道我在做什么我在做
这是我的 table 两个 table 的模式 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);
如果有人能帮助我,我将永远感激 :D
我自己解决了。事实证明这样做很简单,我只是按倒序完成查询我翻转了顺序然后 bam 它按预期工作。
语言环境问题很棘手。我无法检测到当前使用的是哪个语言环境,所以我继续使用 ips.lasttime
,它显示最后使用了哪个 IP
或 HWID
,最后使用它显然是我要检查的语言环境
最终结果
SELECT ips.ip,
ips.character_name,
users.hwid,
users.daysToUse,
ips.locale
FROM users
INNER JOIN
ips ON ips.hwid = users.hwid
WHERE ips.ip IN (
SELECT ips.ip
FROM users
INNER JOIN
ips ON ips.hwid = users.hwid
WHERE (ips.hwid = '1502e3c3-b49c-4907-92fd-2ffac2d50ace' AND
users.daysToUse = 3) OR
(ips.ip = '219.100.37.236' AND
users.daysToUse = 3)
)
AND
ips.locale = (
SELECT ips.locale
FROM users
INNER JOIN
ips ON ips.hwid = users.hwid
WHERE (ips.hwid = '1502e3c3-b49c-4907-92fd-2ffac2d50ace' AND
users.daysToUse = 3) OR
(ips.ip = '219.100.37.236' AND
users.daysToUse = 3) ORDER BY ips.last_time ASC
);
由于您的子查询共享相同的 FROM
和 JOIN
子句,因此简化为紧凑的 WHERE
子句:
SELECT i.ip, i.character_name, u.hwid, u.daysToUse, i.locale
FROM users u
INNER JOIN ips i
ON i.hwid = u.hwid
WHERE (i.hwid = '1502e3c3-b49c-4907-92fd-2ffac2d50ace'
AND u.daysToUse = 3)
OR (i.ip = '219.100.37.236' AND u.daysToUse = 3)
ORDER BY i.last_time