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 HWIDcurrent 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,它显示最后使用了哪个 IPHWID ,最后使用它显然是我要检查的语言环境

最终结果

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
       );

由于您的子查询共享相同的 FROMJOIN 子句,因此简化为紧凑的 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