2015-06-10 5 views
0

Я нахожусь в точке, где мне нужно научиться использовать более сложные функции SQL, если я хотел бы продвинуть свою карьеру. Признаюсь, я не знаю, что такое соединение или как их использовать. Я начинаю читать запросы с помощью объединений, и мой мозг просто превращается в месиво, но я столкнулся с ситуацией, когда я мог бы выиграть от использования соединения, но я не знаю, возможно ли то, что я хочу сделать.Обучение использованию расширенных функций SQL

рассмотрит следующие таблицы:

пользователя

id | user_name | location_id 
=============================== 
1 | r3wt  | 316 

расположения

id | state | city 
========================= 
316 | Clarksville | Arkansas 

Теперь, когда я выбрать пользователь, я получить обратно массив как

[ 
    id => 1, 
    user_name => r3wt , 
    location_id =>316 
] 

Что я хотел бы получить обратно:

[ 
    id => 1, 
    user_name => r3wt , 
    location_id =>[ 
     id=>316, 
     city=>Clarksville, 
     state=>Arkansas 
    ] 
] 

Я интересно, если это возможно, и если это так, как я мог бы изменить мое довольно мягкий запрос на выборку, чтобы сделать это возможным. Спасибо, и если вам нужно больше деталей или хотите, чтобы я сделал то, что будет жалкой попыткой разобраться в себе, я готов смутить себя, чтобы учиться. спасибо

Мой жалкий попытка, которая, конечно, не работает:

SELECT id, user_name, location AS location_id 
FROM user JOIN location ON location.id = user.location_id 

Имейте в виду, я совершенно не знаю, что я делаю. я даже не понимаю, что такое объединения и как они работают, но я понимаю, что я хотел бы иметь возможность делать с SQL.

+0

Mysql вернет только строки. вы можете обработать этот массив в нужной структуре. –

+0

вы используете php с вашим mysql? –

+0

как насчет использования любого ORM в mysql .. это может быть хорошим началом -> http://www.doctrine-project.org/ –

ответ

2

Вы должны:

SELECT u.id, u.name, u.location_id, l.city, l.state 
FROM user u -- identify columns from user table with 'u.' 
LEFT OUTER JOIN location l -- identify columns from location with 'l.' 
    ON u.location_id = l.id --- the join predicate when the two ids match 
WHERE l.state = 'Arkansas' -- other selection criteria 

Это даст вам почти то, что вы хотели, но в качестве одного плоского массива: -

[ 
    u.id => 1, 
    u.user_name => r3wt , 
    u.location_id => 316, 
    l.city=>Clarksville, 
    l.state=>Arkansas 
] 

результатов SQL всегда двумерный таблицы. Это имеет фундаментальное значение для работы SQL! «LEFT OUTER» означает, что вам нужны нулевые значения для города и состояния в результате, если местоположение отсутствует.

Просто Google "MYSQL TUTORIAL", и вы найдете десятки сайтов, предлагающих онлайн-гиды бесплатно. Не могу порекомендовать конкретного, поскольку я изучил все это в предыстории.

+0

спасибо за знание чувак, я ценю его. – r3wt

1

Соединения объединяются в две или более таблицы, чтобы получить результаты от всех них. Существует несколько типов объединений, и вы можете прочитать о них здесь: http://www.w3schools.com/sql/sql_join.asp

Важно помнить, что MySql возвращает строки, поэтому в вашем примере, если для обсуждения у пользователя может быть несколько местоположений, вы не будете использовать join - или если вы используете соединения, у вас будет несколько строк идентификатора пользователя и разных его местоположений.

В вашем примере, для пользователя, которые имеют одну строку местоположения вы можете запустить этот запрос

SELECT * 
FROM user 
INNER JOIN location 
ON user.location_id=location.id; 

Этот запрос вернет вам строки для всех пользователей, у которых есть запись о местоположении, и вы получите все поля обеих таблиц (как мы использовали *).

+0

пользователь может иметь только одно местоположение. – r3wt

+0

@ r3wt Если у пользователя может быть только одно местоположение, почему вы хотите создать структуру с массивом для местоположений? – Jens

+0

Объект @Jens User хранится в центральном хранилище данных redis для быстрого доступа (в качестве объекта сеанса типа «NS \ User». Как таковой, мы хотим сохранить как можно больше данных в пользовательском сеансе для быстрого доступа и глобальные данные синхронизируются с memcache для быстрого доступа и обновления (записываются за), поэтому у пользователя есть местоположение, а определенные * вещи * извлекаются на определенных страницах, связанных с этим местоположением. – r3wt

Смежные вопросы