2011-04-09 3 views
0

저는 WHMCS로 개인적인 사용을위한 몇 가지 작은 플러그인을 작성하려고 노력해 왔습니다. 본질적으로 내가 여기서하려고하는 것은 특정 순서 (들)에 대한 정보를 모아서 Perl의 배열로 반환하는 것입니다.SQL 쿼리가 가짜 중복 결과를 반환합니까?

나는 그것이 내가이 나에게주고 스트레스를 형성 한 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 

나는 그것을 시도했습니다 .. 사람이 내가 경기 당 반환이 아니라 하나 개의 행을 원하는이 하나 .. (아마 분명 충분하지) Obvioiusly로 잘못 갔어요 위치에 나에게 머리를 포기할 수 데이터베이스> 1 개 도메인과는 어떤 도움이 많이있는 테이블 정의없이 근처 불가능 :

답변

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' 
+0

감사합니다. – Jarrod

+0

고유함은 즉각적인 문제를 해결할 (숨기기) 것이지만 중복 결과가 나타나는 이유를 찾아야합니다. 아마도 두 테이블을 조인하는 where 절이 없을 것입니다 ... 아래 Nanne의 대답을 참조하십시오. –

+0

근본적인 문제를 숨기므로이 문제에 대해 강력히 권고합니다. – Nanne

2

음을 감상 할 수있다

.. 일치하는 각 중복을 반환하지만, 거기에 많은 조인을하고 있습니다. 당신은 tblhosting.id로 시작하여 거기에서 '위로'나아가고 있습니다. 연결된 테이블에 이중 항목이 있으면 더 많은 조회수가 발생합니다.

DISTINCT을 쿼리에 추가 할 수는 있지만 기본적인 문제는 해결되지 않습니다. 데이터에 문제가있을 수 있습니다. 송장이 2 개입니까? 어쩌면 모든 것을 (SELECT * FROM) 선택하고 무엇이 반환되는지 확인해야합니다. 아마도 테이블에 이중 내용이 있는지 확인할 수 있습니다.

DISTINCT을 사용하면 대부분의 경우 좋은 선택이 아닙니다. 즉, 쿼리 또는 데이터가 올바르지 않거나 철저히 이해하지 못했음을 의미합니다. 지금 당장 올바른 결과를 얻지 만 나중에 문제가 발생할 수 있습니다.

다음과 같은 이유가 발생할 수 있습니다. 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' 
+0

머리를 고맙게 생각합니다.데이터베이스에 중복되거나 잘못된 데이터가 있는지 확인 했으므로 잘못된 쿼리로 처리했습니다. 'DISTINCT'를 사용하면 현재이 문제를 해결하는 것처럼 보입니다.하지만이 문제를 해결할 수있는 다른 방법을 찾아야 만한다는 것을 알고 있습니다. 솔직히 말해서 이것은 제가 사용하기 전까지는 사용하기위한 프로토 타입 일뿐입니다. 충분한 시간과 충분한 기초 코드가이 프로젝트를 실제로 실행하고 실행하는 것입니다. 앞으로는이 제품이 프로덕션 서버에있을 때 상황이 악화 될 것이므로 지금 다루는 것이 훨씬 더 좋을 것이라고 생각합니다. 다시 한 번 감사드립니다. !! !! :) – Jarrod

+0

그래서 "선택 *"하면 어떻게됩니까? – Nanne

+0

Selecing * 중복과 동일한 문제가있는 것 같습니다. 나는 이것에 대해 100 % 확실하지 않습니다. 어쩌면 나는 분리 된 쿼리로 분할해야 할 것입니다. 나는 그것을 결합 할 때 약간 대담하다는 것을 알고있었습니다. 모두 함께 .. – Jarrod

1

내가 tblproducts에 가입 쿼리에 표시되지 않습니다 무슨 일이 일어나고 있는지 볼 수 있습니다, 이유가 될 것으로 보인다.

+0

그 중 하나를 주셔서 감사합니다. 나는 다음을 포함하도록 쿼리를 변경했습니다. 어디에 tblorders.status = 'Pending' AND tblproducts.id = tblhosting.packageid ... 그리고 그것은 그렇게 보입니다;) – Jarrod

관련 문제