1

我正在使用的查询调用数据库中的几个表并且工作正常。但是,当我将第 10 行添加到组合中时,它会返回 50 个或更多重复结果。我对 SQL 和 Sequel Pro 还有些陌生,所以我确信解决方案不会太复杂,但我现在真的很难过。

这是代码:

SELECT c.first_name, c.last_name, ca.company, ca.city, ca.state, ct.certificate_number,   ct.certificate_date
FROM customer c, customer_type ctype, cust_address ca, certification ct, cust_prof_cert cp
WHERE ca.id_customer = c.id_customer LIKE cp.prof_cert_id_prof_cert
AND c.customer_type_id_customer_type = ctype.id_customer_type
AND ct.customer_id_customer = c.id_customer
AND ca.id_customer = c.id_customer
AND ctype.customer_type IN('CIRA','CIRA, CDBV')
AND ct.course_type_id_course_type = 1
AND ct.certificate_number IS NOT NULL
AND cp.prof_cert_id_prof_cert = "1"
ORDER BY ct.certificate_number ASC, c.last_name ASC;

感谢您的时间。

4

3 回答 3

2

通过像这样执行 SQL,您并没有关联数据,只是选择它。我建议将您的 SQL 更改为使用 JOINS。

SELECT Orders.OrderID, Customers.CustomerName, Orders.OrderDate
FROM Orders
INNER JOIN Customers
ON Orders.CustomerID=Customers.CustomerID; 

这是一篇可能对您有所帮助的文章:w3schools, Joins

于 2013-10-31T15:36:18.670 回答
1

这是您使用 SQL92 连接语法的查询。您应该使用此语法而不是 SQL89“逗号样式”连接。

SELECT c.first_name, c.last_name, ca.company, ca.city, ca.state, 
  ct.certificate_number, ct.certificate_date
FROM customer AS c
INNER JOIN customer_type AS ctype ON c.customer_type_id_customer_type = ctype.id_customer_type
INNER JOIN cust_address AS ca ON ca.id_customer = c.id_customer
INNER JOIN certification AS ct ON ct.customer_id_customer = c.id_customer
INNER JOIN cust_prof_cert AS cp    -- what's this join condition?
WHERE ca.id_customer = c.id_customer LIKE cp.prof_cert_id_prof_cert
  AND ctype.customer_type IN('CIRA','CIRA, CDBV')
  AND ct.course_type_id_course_type = 1
  AND ct.certificate_number IS NOT NULL
  AND cp.prof_cert_id_prof_cert = '1'
ORDER BY ct.certificate_number ASC, c.last_name ASC;

我在这个查询中注意到了一些奇怪的事情:

  • WHERE 子句中的第一项很奇怪。你应该知道它LIKE的优先级比它高,=所以这可能不会像你认为的那样做。好像你写的

    WHERE ca.id_customer = (c.id_customer LIKE cp.prof_cert_id_prof_cert)
    

    这意味着评估LIKE并产生 0 或 1 来表示布尔条件。然后查找与 0 或 1 匹配的 ca.id_customer。

  • 鉴于这个奇怪的术语,我找不到该cp表的其他连接条件。如果您没有对其进行任何限制,则默认连接是每一行都匹配连接表中的每一行。因此,如果您有 50 行 where cp.prof_cert_id_prof_cert = 1,那么它将有效地将其余连接表的结果乘以 50。

    这被称为笛卡尔积,或者在 MySQL 的说法中,它在 SHOW STATUS 中被视为Full join

  • ctype.customer_type IN('CIRA','CIRA, CDBV')您已经将第二个和第三个字符串一起引用了。基本上,这意味着您正在尝试将列与两个字符串进行匹配,其中一个字符串恰好包含一个逗号。

    您可能打算这样写ctype.customer_type IN('CIRA','CIRA','CDBV'),以便该列可以匹配这三个值中的任何一个。

于 2013-10-31T15:51:24.637 回答
0

我建议不要在您的 FROM 子句中查询多个表,我相信这是您重复行的原因。如果您将表分离成单独的内连接或左连接(无论您需要哪个),您应该能够手动匹配每个表中的哪个键,而不是让 SQL 尝试自动执行此操作。

于 2013-10-31T15:38:41.760 回答