SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 02.10.2016 18:16:44

Dagon2016
Участник
Зарегистрирован: 02.10.2016
Сообщений: 7

left join

Здравствуйте! ОбЪединяю две таблицы с помощью LEFT JOIN, в одной таблице зарегистрированные пользователи, имеют айди 1, 2, 3, 4... и т.д, в другой храняться данные от зарегистрированных и незарегистрированных пользователей, айди 1, 2, 3, 7ho66ip5dm, 4 , и т.д. При объединении таблиц вывожу логин по айди, и все бы нормально, только 7ho66ip5dm не зарегистрированный пользователь, и, из-за первой цифры 7 выводится логин под айди 7. Весь день бьюсь, что тут не так?

("SELECT t1.*, t2.login as login, DATE_FORMAT(t1.time_pay, '%d.%m.%y, %H:%i') as f_time_pay FROM `".PREFIX."_history_pay` AS t1 LEFT JOIN `".PREFIX."_users` AS t2 ON t1.user_id = t2.id LIMIT ".$start_pos.", ".$perpage."");

Неактивен

 

#2 02.10.2016 18:22:27

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: left join

не понял; покажите пример тестовых данных и какой должен быть результат

Неактивен

 

#3 02.10.2016 18:22:36

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2422

Re: left join

Создайте таблички и наполните тестовыми данными на sqlfiddle и приведите пример того результата, который Вы хотите получить.


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#4 02.10.2016 18:34:01

Dagon2016
Участник
Зарегистрирован: 02.10.2016
Сообщений: 7

Re: left join

Если во второй таблице покупка неавторизованным пользователем помечается jhfhjdfhjfd, 5fghkvbhk, 2, 7, то при объединении, неавторизованные пользователи, совершившие покупку, где user_id jhfhjdfhjfd, выводится пустая ячейка, но, если незарегистрированный пользователь с user_id 5fghkvbhk, то перваяя цифра выводится под логином пользователя с id=5, как в left join соединить эти таблицы, и при проверке, незарегистрированные пользователи выводили пустую ячейку, несмотря, на то, что их айди начинается на цифру с последующими символами.

Неактивен

 

#5 02.10.2016 18:39:43

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: left join

все равно не понятно.

Неактивен

 

#6 02.10.2016 18:51:09

Dagon2016
Участник
Зарегистрирован: 02.10.2016
Сообщений: 7

Re: left join

vasya написал:

все равно не понятно.

Вот смотри, есть в таблице колонка user_id, куда вносятся данные о покупках - если человек авторизован, - то вносится в user_id его id(1,2,3), если человек не авторизован, то его покупки вносятся в user_id как jghdgfjgdh, 2gjhjgfgfhj,9mkvbmnm.
Тут я выдергиваю логин, дату, айди покупки, статус

("SELECT t1.*, t2.login as login, DATE_FORMAT(t1.time_add, '%d.%m.%y, %H:%i') as f_time_add FROM `".PREFIX."_history_out` AS t1 LEFT JOIN `".PREFIX."_users` AS t2 ON t1.user_id = t2.id LIMIT ".$start_pos.", ".$perpage."");

Но, если в user_id начинается 2gjhjgfgfhj, 9mkvbmnm, то они идут как пользователи под айди 2, 9, хотя они не зарегистрированы, просто при объединении таблицы юзер айди и айди, 1 цифра (хэша) или чего там, считается как зарегистрированный пользователь с присвоенным к нему этим айди.

Неактивен

 

#7 02.10.2016 19:07:44

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: left join

если я правильно вас понял, то

MariaDB [(none)]> select * from (select 2 as id) t left join (select '2gjhjgfgfhj' as id2) t2 on cast(id as char)=id2;
+----+------+
| id | id2  |
+----+------+
|  2 | NULL |
+----+------+
1 row in set (0.09 sec)

MariaDB [(none)]> select * from (select 2 as id) t left join (select '2gjhjgfgfhj' as id2) t2 on id=id2;
+----+-------------+
| id | id2         |
+----+-------------+
|  2 | 2gjhjgfgfhj |
+----+-------------+
1 row in set, 1 warning (0.00 sec)
 

Неактивен

 

#8 02.10.2016 19:23:03

Dagon2016
Участник
Зарегистрирован: 02.10.2016
Сообщений: 7

Re: left join

vasya написал:

если я правильно вас понял, то

MariaDB [(none)]> select * from (select 2 as id) t left join (select '2gjhjgfgfhj' as id2) t2 on cast(id as char)=id2;
+----+------+
| id | id2  |
+----+------+
|  2 | NULL |
+----+------+
1 row in set (0.09 sec)

MariaDB [(none)]> select * from (select 2 as id) t left join (select '2gjhjgfgfhj' as id2) t2 on id=id2;
+----+-------------+
| id | id2         |
+----+-------------+
|  2 | 2gjhjgfgfhj |
+----+-------------+
1 row in set, 1 warning (0.00 sec)
 

Возможно, но я ничего не понял) Как в этом запросе не сравнивать зарегистрированного пользователя (4kjghjkhf) с зарегистрированным пользователем  под id=4, а выводить пустую строку?
("SELECT t1.*, t2.login as login, DATE_FORMAT(t1.time_add, '%d.%m.%y, %H:%i') as f_time_add FROM `".PREFIX."_history_out` AS t1 LEFT JOIN `".PREFIX."_users` AS t2 ON t1.user_id = t2.id LIMIT ".$start_pos.", ".$perpage."");

Неактивен

 

#9 02.10.2016 19:48:20

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: left join

cast(t1.user_id as char) = t2.id

Неактивен

 

#10 02.10.2016 20:14:06

Dagon2016
Участник
Зарегистрирован: 02.10.2016
Сообщений: 7

Re: left join

vasya написал:

cast(t1.user_id as char) = t2.id

Нее, 2fdjhfdjhfdh определяется как id=2

Неактивен

 

#11 02.10.2016 21:53:31

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: left join

Dagon2016 написал:

Нее, 2fdjhfdjhfdh определяется как id=2

тогда без тестового примера мы так и не перейдем к конкретике

Неактивен

 

#12 03.10.2016 23:33:38

Dagon2016
Участник
Зарегистрирован: 02.10.2016
Сообщений: 7

Re: left join

Vasya. Через LEFT JOIN соединяю эти таблицы:
http://images.vfl.ru/ii/1475524953/33ac0239/14369460.png
http://images.vfl.ru/ii/1475525011/6fe63600/14369469.png
Подскажи пожалуйста, почему вот этот незарегистрированный user_id(7ho66ip5dmibm4b1uvjsvntvr0) сравнивается с зарегистрированным id7, и выводится под логином QWERTY, хотя это разные люди. Запрос такой:
("SELECT t1.*, t2.login as login, DATE_FORMAT(t1.time_add, '%d.%m.%y, %H:%i') as f_time_add FROM `".PREFIX."_history_out` AS t1 LEFT JOIN `".PREFIX."_users` AS t2 ON t1.user_id = t2.id LIMIT ".$start_pos.", ".$perpage."");
Наставь меня пожалуйста на путь истинный, два дня читаю про эти JOIN, немогу понять.

Отредактированно Dagon2016 (03.10.2016 23:34:57)

Неактивен

 

#13 04.10.2016 08:18:52

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: left join

потому что сервер преобразует 7ho66ip5dmibm4b1uvjsvntvr0 в число и получается 7, чтобы этого не происходило нужно явно указать ему проводить сравнение как со строкой:
.. ON cast(t1.user_id as char) = cast(t2.id as char) LIMIT ..

Неактивен

 

#14 04.10.2016 21:58:51

Dagon2016
Участник
Зарегистрирован: 02.10.2016
Сообщений: 7

Re: left join

vasya написал:

потому что сервер преобразует 7ho66ip5dmibm4b1uvjsvntvr0 в число и получается 7, чтобы этого не происходило нужно явно указать ему проводить сравнение как со строкой:
.. ON cast(t1.user_id as char) = cast(t2.id as char) LIMIT ..

Спасибо Вам огромное!!! Вы очень хороший человек!!!  Теперь вывод результата как задумано.

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson