#mysql #sql #join
#mysql #sql #Присоединиться
Вопрос:
Прямо сейчас у меня есть 2 таблицы, и они выглядят следующим образом:
points
Таблица выглядит следующим образом:
id country points
1 4 1
2 7 5
3 8 4
sample
Таблица выглядит следующим образом:
id iso pts
1 UK 100
2 US 300
3 AU 700
4 BO 1200
5 BA 1500
6 BR 2000
7 HR 5000
8 TD 10000
9 CA 15000
По сути, я хочу выбрать ВСЕ данные из points
таблицы, где points.country
и points.points
соответствует sample.iso
и sample.pts
.
Итак, результат, которого я хотел бы достичь, это:
id country points
1 BO 100
2 HR 1500
3 TD 1200
Действительно ли это достижимо? Если да, то как?
Комментарии:
1. Ваши результаты выборки не соответствуют вашим данным выборки.
2. @FreeAsInBeer , на самом деле это так. Поля
country
иpoints
являются внешними ключами кsample
таблице.3. Хотя это действительно странный запрос
4. @Linger Мой предыдущий комментарий касался не вашей связи между двумя таблицами, а скорее связи ваших таблиц с предоставленными вами примерами результатов. В ваших результатах у вас есть
BO, 100
, но в ваших таблицахBO
это связано сpoints = 1
иpts = 1200
. Пожалуйста, помните для будущих вопросов: легче получать конструктивные ответы, если вы предоставляете логические наборы данных.
Ответ №1:
Вам придется дважды подключиться к sample
таблице, чтобы получить нужную информацию (SQL FIDDLE):
SELECT p.id, s1.iso AS country, s2.pts AS points
FROM points p
INNER JOIN sample s1 ON p.country = s1.id
INNER JOIN sample s2 ON p.points = s2.id
Комментарии:
1. это должно быть left join demo inner join , demo left join
2. М Халид Джунаид , в случае данных, предоставленных Radical_Activity , ВНУТРЕННЕЕ СОЕДИНЕНИЕ работает просто отлично. Смотрите мой SQL Fiddle. Я согласен, хотя, если есть вероятность, что значение может содержать
country
илиpoints
не содержать значения, тогда следует использовать ЛЕВОЕ СОЕДИНЕНИЕ.3. @Linger Да, существует вероятность, что country и points не содержат значения. Также могу я спросить вас, является ли это обычным запросом для выполнения? Я просто делаю это так, поэтому, если таблица ‘points’ получит новую строку, она не будет перегружена информацией. Однако я не знаю, что было бы быстрее. Кстати, у меня есть около 7 столбцов, таких как country, points и т.д.. Предполагаемый объем строк в таблице points составит около 1000-2000, однако к ней будет часто запрашиваться каждый час. Итак, это решение лучшее или я должен просто поместить значения в
points
таблицу?4. @Radical_Activity , тогда для всех соединений с
sample
таблицей вам захочется использовать ЛЕВОЕ СОЕДИНЕНИЕ. Довольно часто к одной и той же таблице присоединяются более одного раза. Однако способ, которым вы это используете, вообще не очень распространен, потому чтоcountry
иpoints
вообще не связаны друг с другом, хотя они находятся в одной таблице. Я мог видеть, чтоcountry
это его собственная таблица, посколькуcountry
к ней может быть привязано много информации. Однако,points
вероятно, было бы лучше хранить непосредственно вpoints
таблице, поскольку я предполагаю, что вы можете расширитьpoints
дальше.
Ответ №2:
с помощью left join или любого другого соединения вы можете это сделать
select t1.id,t1.country,t1.points from table1 as t1 left join table2 as t2 on t1.id=t2.country
Ответ №3:
Это похоже на то, что вы ищете. Это внутреннее соединение между points
и sample
, которое соответствует points.country
sample.id
и points.points
to sample.pts
.
Предоставленные вами данные не показывают ничего, points.points
что соответствует sample.pts
, но я думаю, что это то, к чему вы стремились. Если нет, пожалуйста, уточните в своем вопросе.
select p.id, s.iso, s.pts
from points p, sample s
where p.country = s.id
and p.points = s.pts;