【问题标题】:Performing a join on ZenCart's address book entries在 ZenCart 的地址簿条目上执行连接
【发布时间】:2012-10-24 16:58:58
【问题描述】:

我有以下代码:

$referrers_query = 
select c.customers_id, c.customers_firstname, c.customers_lastname, 
c.customers_email_address, c.customers_telephone, a.entry_street_address, 
a.entry_city, a.entry_state, a.entry_country_id, n.countries_name, 
a.entry_zone_id, a.entry_postcode, r.referrer_customers_id, 
r.referrer_key, r.referrer_homepage, r.referrer_approved, 
r.referrer_banned, r.referrer_commission from  customers as c,  
address_book  as a, referrers  as r, countries as n  
where a.entry_country_id = n.countries_id and c.customers_id = r.referrer_customers_id 
and a.address_book_id = c.customers_default_address_id  order by c.customers_lastname;

我想要做的是,而不是进行 WHERE 子句连接,我想嵌套连接。

上面提到了五个数据库表。 客户、地址簿、推荐人、国家、地区。

但我不知道从哪里开始。这样做的主要问题是使用上述语句,我似乎从选择中丢失了一些记录。这是因为有些记录使用 'zone_id' = 0。对此的解决方法是简单地为 0 创建一个空白记录,但除此之外,我可以使用连接来解决这个问题吗?

【问题讨论】:

  • 也许重新格式化该查询,使其真正可读?也许指出哪一行是 502 行?也许尝试var_dump() 而不是echo
  • 完全改变了整个问题,但我也会尝试 var_dump 方法。

标签: php mysql join zen-cart


【解决方案1】:

使用显式JOINs 编写的查询:

SELECT c.customers_id, c.customers_firstname, c.customers_lastname, 
    c.customers_email_address, c.customers_telephone, a.entry_street_address, 
    a.entry_city, a.entry_state, a.entry_country_id, n.countries_name, 
    a.entry_zone_id, a.entry_postcode, r.referrer_customers_id, 
    r.referrer_key, r.referrer_homepage, r.referrer_approved, 
    r.referrer_banned, r.referrer_commission
FROM customers AS c
    JOIN referrers AS r ON (c.customers_id = r.referrer_customers_id)
    JOIN address_book AS a ON (a.address_book_id = c.customers_default_address_id)
    JOIN countries AS n ON (a.entry_country_id = n.countries_id)
ORDER BY c.customers_lastname

如果您还想从区域表中获取信息(如果存在匹配项),则需要像这样添加 LEFT JOIN

SELECT c.customers_id, c.customers_firstname, c.customers_lastname, 
    c.customers_email_address, c.customers_telephone, a.entry_street_address, 
    a.entry_city, a.entry_state, a.entry_country_id, n.countries_name, 
    a.entry_zone_id, a.entry_postcode, r.referrer_customers_id, 
    r.referrer_key, r.referrer_homepage, r.referrer_approved, 
    r.referrer_banned, r.referrer_commission
FROM customers AS c
    JOIN referrers AS r ON (c.customers_id = r.referrer_customers_id)
    JOIN address_book AS a ON (a.address_book_id = c.customers_default_address_id)
    JOIN countries AS n ON (a.entry_country_id = n.countries_id)
    LEFT JOIN {zones table name} AS z ON (z.{zones id column name} = a.entry_zone_id)
ORDER BY c.customers_lastname

并将您要选择的列添加到查询的顶部。 LEFT JOIN 始终从左表(列出的第一个)返回结果,如果右表中没有匹配项,则为右表的列返回 NULLs。

【讨论】:

  • 非常感谢。区域的表名实际上是区域,ID 的列是 zone_id 但我设法弄清楚了。这非常有效。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-16
  • 1970-01-01
相关资源
最近更新 更多