Как выбрать несколько столбцов с MySQL на основе нескольких записей?

#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;