这个标题真的没用,但它是一个复杂的问题(在我的脑海中,也许)......任何......
说我有一个国家的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指出我正确的方向,那就表示感谢。
谢谢大家:)
答案 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 in
或not 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 )
如果我理解正确,也许你需要这样的东西?