sqlite3与php如何交叉引用列与其他列中的数据

ttp71kqs  于 2021-07-29  发布在  Java
关注(0)|答案(2)|浏览(430)

下面是我的示例数据

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

如果有人能帮我,我将永远感激

cyvaqqii

cyvaqqii1#

因为您的子查询共享相同的 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
dba5bblo

dba5bblo2#

我自己解决的。。事实证明,这是非常简单的,我只是让查询做了向后的顺序,我翻转了顺序,砰的一声,它的预期工作。
区域设置问题很难解决。。我无法检测当前使用的区域设置,因此我使用 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
       );

相关问题