我一直在努力为WHMCS写一些个人用的小插件。基本上我在这里尝试做的是获取一些关于某个订单的信息,并将其作为Perl中的数组返回。
Perl位我很好,这是我形成的MySQL查询给了我压力..
我知道这很大而且很乱,但我拥有的是:
SELECT tblhosting.id, tblhosting.userid, tblhosting.orderid, tblhosting.packageid, tblhosting.server, tblhosting.domain, tblhosting.username, tblorders.invoiceid, tblproducts.gid, tblservers.ipaddress, tblinvoices.status
FROM tblhosting, tblproducts, tblorders, tblinvoices, tblservers
WHERE tblorders.status = 'Pending'
AND tblproducts.gid = '2'
AND tblservers.id = tblhosting.server
AND tblorders.id = tblhosting.orderid
AND tblinvoices.id = tblorders.invoiceid
AND tblinvoices.status = 'Paid'
我不知道这是/应该/是否有效,但我认为我是在正确的轨道上,因为它确实返回了我正在寻找的东西,但它会将所有东西都返回两次。
例如,我创建了一个域名为“sunshineee.info”的新帐户,然后在PHPMyAdmin中运行了上述查询。
id userid orderid packageid server domain username invoiceid gid ipaddress status
13 7 17 6 1 sunshineee.info sunshine 293 2 184.22.145.196 Paid
13 7 17 6 1 sunshineee.info sunshine 293 2 184.22.145.196 Paid
任何人都可以告诉我这个问题出在哪里。不好意思(可能不是很明显)我想要这个,因为每场比赛只返回一行..我已经尝试过> 1数据库中的域,并为每个匹配返回重复项。
非常感谢任何帮助 :)
答案 0 :(得分:2)
SELECT distinct tblhosting.id, tblhosting.userid, tblhosting.orderid, tblhosting.packageid, tblhosting.server, tblhosting.domain, tblhosting.username, tblorders.invoiceid, tblproducts.gid, tblservers.ipaddress, tblinvoices.status
FROM tblhosting, tblproducts, tblorders, tblinvoices, tblservers
WHERE tblorders.status = 'Pending'
AND tblproducts.gid = '2'
AND tblservers.id = tblhosting.server
AND tblorders.id = tblhosting.orderid
AND tblinvoices.id = tblorders.invoiceid
AND tblinvoices.status = 'Paid'
答案 1 :(得分:2)
嗯,没有任何表定义,它几乎是不可能的,但你在那里做了很多连接。你开始使用tblhosting.id并从那里开始“向上”工作。如果任何连接的表具有双重条目,您将获得更多命中
您可以在查询中添加DISTINCT
,但这不会解决根本问题。这可能是您数据的问题:您有2张发票吗?也许您应该选择所有内容(SELECT * FROM
)并检查返回的内容,或者检查您的表格是否有双重内容。
使用DISTINCT
大部分时间都不是一个好的选择:它表示您的查询或数据不正确(或者您不完全理解它们)。它现在可能会让你得到正确的结果,但以后会让你遇到麻烦。
猜测发生这种情况的原因: 您没有将products表连接到id的链。所以你基本上可以在你的结果中添加一个'2'。你加入产品,唯一限制该表的是“gid”应该是2.所以如果你添加一个带有gid 2的产品,你会得到另一个结果。要么加入它(也许是tblproduct.orderid = tblorders.id?只是在这里猜测)或者只是删除它,因为它在我看不到任何事情。
如果您想让查询更清晰一些,请尝试不要隐式加入,而是这样做。所以你实际上可以看到发生了什么
SELECT tblhosting.id, tblhosting.userid, tblhosting.orderid, tblhosting.packageid, tblhosting.server, tblhosting.domain, tblhosting.username, tblorders.invoiceid, tblproducts.gid, tblservers.ipaddress, tblinvoices.status
FROM tblhosting
JOIN tblproducts ON /*you're missing something here!*/
JOIN tblorders ON tblorders.id = tblhosting.orderid
JOIN tblinvoices ON tblinvoices.id = tblorders.invoiceid
JOIN tblservers ON tblservers.id = tblhosting.server
WHERE
tblorders.status = 'Pending'
AND tblproducts.gid = '2'
AND tblinvoices.status = 'Paid'
答案 2 :(得分:1)
我在查询中没有看到加入tblproducts
,这似乎是一个原因。