MySQL - 构造查询以丢弃常见结果

时间:2014-07-22 12:52:36

标签: php mysql sql laravel

这个标题真的没用,但它是一个复杂的问题(在我的脑海中,也许)......任何......

说我有一个国家的MySQL表(世界上所有国家的A-Z),id和amp;名称

然后我有一张表格,用于跟踪用户所访问的国家/地区:就像这样:

    Country Table
    id    name
    1     india
    2     luxembourg
    3     usa

    Visited Table
    id    user_id    country_id    
    1     1          1
    2     1          3

现在这就是我想要做的事情,当我提交表格以添加到我想要的国家/地区的访问国家列表时.id 1& 3将从查询结果中排除。

我知道我可以使用PHP过滤这个...这是我过去所做的事情......但肯定必须有一种方法来构建一个查询以1&从退回的结果中排除3,如:

    SELECT * 
      FROM `countries` 
     WHERE `id`!= "SELECT `country_id` 
                     FROM `visited` 
                     WHERE `user_id`='1'"

我怀疑它与JOIN语句有关但我无法弄明白。

如果有人可以用Laravel指出我正确的方向,那就表示感谢。

谢谢大家:)

3 个答案:

答案 0 :(得分:2)

这是你想要的吗?

select c.*
from countries c left join
     visited v
     on c.id = v.country_id and v.user_id = 1
where v.country_id is null;

您也可以将其表示为not innot exists,但left join方法通常具有相当不错的性能。

左外连接将所有记录保留在第一个表中,无论on子句是否计算为true。如果第二个表中没有匹配项,则列中将填充NULL个值。 where子句只选择这些记录 - 那些不匹配的记录。

以下是另一种表达方式,您可能会更容易理解:

select c.*
from countries c
where not exists (select 1 from visited where c.id = v.country_id and v.user_id = 1)

答案 1 :(得分:0)

您可以像这样使用您的查询。

SELECT * 
  FROM `countries` c LEFT JOIN `visited` v on c.id = v.country_id
 WHERE v.`country_id` is null
   AND v.`user_id` = 1

这是LEFT JOIN的操作。我的意思是,我根据国家/地区的ID选择表countries中可能会或可能不会在表visited上的所有注册表。

所以它会带给你这个小组

from country      from visited
     1                 1
     2              no registry
     3                 3

所以在where条件(v.country_id is null)我说:我只想在这个左边的连接操作只在国家桌子上,但它不在访问表上,所以它带给我身份2。此外,条件是所访问的注册管理机构必须来自user_id=1

答案 2 :(得分:0)

SELECT * FROM COUNTRIES LEFT JOIN 
VISITED ON 
countries.id = visited.country_id and visited.country_id NOT IN ( SELECT country_id FROM visited )

如果我理解正确,也许你需要这样的东西?