MySQL在加入/选择标准中苦苦挣扎

时间:2012-11-12 04:27:51

标签: mysql join

我希望有人能指出我正确的方向。

我有一张COUNTRY表,其中包含主要ID和国家/地区名称(例如法国)

我有第二张表PAYMETHODS_COUNTRIES,其中包含主要ID,付款方式ID(例如4)和国家/地区ID

我正在尝试输出每种付款方式的复选框列表,以控制哪些国家/地区(或哪些国家/地区的用户)可以访问这些本地付款方式。

我的复选框列表工作正常,表单的处理也正常。最后一件事是输出选定国家/地区的国家/地区复选框列表(例如,这种付款方式在法国和德国有售),显示为CHECKED。

所以我要做的是输出所有国家的完整清单

SELECT id, name FROM country ORDER BY id ASC

然后包含PAYMETHODS_COUNTRIES表格(当然不起作用)

SELECT country.id AS countryid,
country.name AS countryname,
paymethods_countries.id AS methodid
FROM country LEFT JOIN `paymethods_countries` 
ON country.id = paymethods_countries.country
WHERE paymethods_countries.paymethod = 10

此示例查询仅显示实际上在PAYMETHODS_COUNTRIES中有记录的行,而不是我所追求的。

我希望的是country.id + country.name的完整列表,带有final字段(PAYMETHODS_COUNTRIES表的ID) - 在没有链接的情况下应为null。这样我就可以检查null或其他,并为这些行输出CHECKED。

希望这是有道理的 - 或者如果有人知道更好的方式来实现我正在做的事情,那么你的想法将受到赞赏。

2 个答案:

答案 0 :(得分:2)

由于您的WHERE子句,因为您说paymethod必须= 10,所以只返回PAYMETHODS_COUNTRIES中有记录的行。添加OR以使其为null:

SELECT country.id AS countryid,
   country.name AS countryname,
   paymethods_countries.id AS methodid
FROM country 
LEFT JOIN `paymethods_countries` 
   ON country.id = paymethods_countries.country
WHERE paymethods_countries.paymethod = 10
   OR paymethods_countries.paymethod IS NULL

答案 1 :(得分:2)

虽然这里的另一个答案将产生所需的结果,但在语义上将条件从WHERE子句移动到ON子句更为正确:

SELECT country.id AS countryid,
    country.name AS countryname,
    paymethods_countries.id AS methodid
FROM country 
LEFT JOIN `paymethods_countries` 
   ON country.id = paymethods_countries.country and paymethods_countries.paymethod = 10

这消除了在WHERE子句中添加额外OR条件的需要。

相关问题