2013-09-07 3 views
1

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

SELECT 
    table1.id, 
    table1.username, 
    table1.password, 
    table1.email, 
    table2.image, 
    table3.intValue, 
    table3.textValue, 
    table3.dateValue 
FROM 
    table1 
LEFT JOIN 
    table2 

ON 
    table1.id = table2.userId 

LEFT JOIN 
    table3 
ON 
    table1.id = table3.userId 
     AND columnName='sex' OR columnName='birthdate' OR columnName='realname' 

WHERE 
    table1.email = $username 
OR 
    table1.username = $username 

ColumnName = 'пол' обозначает целое число (intValue)
ColumnName = 'дата рождения' представляет собой дату (DATEVALUE)
ColumnName = 'RealName' представляет собой строку (textValue)

Спасибо вы.

+1

Почему учетный стол для записи таблицы? Или дата рождения? Также одна из ваших таблиц, по-видимому, представляет собой пары ключ-значение. Вероятно, я этого не сделаю. –

+0

Я хочу вернуть некоторую информацию о профиле пользователя одновременно с регистрацией имени пользователя. – Thomas

+1

Снова я задал вопрос: почему профиль пользователя записывается в пол? –

ответ

1

Вот ваш запрос (отформатирован, так что я могу читать его лучше):

SELECT t1.id, t1.username, t1.password, t1.email, 
     t2.image, t3.intValue, t3.textValue, t3.dateValue 
FROM table1 t1 LEFT JOIN 
    table2 t2 
    ON t1.id = t1.userId LEFT JOIN 
    table3 t3 
    ON t1.id = t3.userId AND 
     columnName='sex' OR columnName='birthdate' OR columnName='realname' 
WHERE t1.email = $username OR t1.username = $username ; 

Одной из проблем является OR условие table3. Это оценивается как:

ON (t1.id = t3.userId AND columnName='sex') OR columnName='birthdate' OR columnName='realname'; 

SQL не читает мысли. Он вызывает правила приоритета. Условие лучше всего указывать как:

 ON t1.id = t3.userId AND 
     columnName in ('sex', 'birthdate', 'realname'); 

Однако, я не думаю, что это вызывает проблему в одной строке. Если что-нибудь, это умножит количество строк.

Казалось бы, вы хотите получить значения в одной строке, тогда как ваш запрос вернет отдельную строку для каждой строки в table3. Если это так, вы должны использовать group by с соответствующей агрегацией. Окончательный запрос будет следующим:

SELECT t1.id, t1.username, t1.password, t1.email, 
     t2.image, 
     max(case when columnName = 'sex' then t3.intValue end) as sex, 
     max(case when columnName = 'realname' then t3.textValue end) as realname, 
     max(case when columnName = 'birthdate' then t3.dateValue end) as birthdate 
FROM table1 t1 LEFT JOIN 
    table2 t2 
    ON t1.id = t1.userId LEFT JOIN 
    table3 t3 
    ON t1.id = t3.userId AND 
     columnName in ('sex', 'birthdate', 'realname') 
WHERE t1.email = $username OR t1.username = $username 
GROUP BY t1.id; 
+0

Это решение моей проблемы. Спасибо, что нашли время. – Thomas

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