Проблема при использовании UNION в запросе

#1 17 сентября 2016 в 19:22
Первая ветка, компонент users
В файле model.php пытаюсь модифицировать sql запрос, который производит выборку пользователей для списка

Вот этот

  1. $sql = "SELECT
  2. u.id,
  3. u.login,
  4. u.nickname,
  5. u.icq,
  6. u.logdate as flogdate,
  7. u.rating,
  8. u.is_deleted as is_deleted,
  9. u.birthdate, u.rating,
  10. u.status as microstatus,
  11. p.city, p.cityid, p.state, p.region, p.country, p.countryid, p.karma, p.imageurl, p.gender as gender
  12.  
  13. FROM cms_users u
  14. INNER JOIN cms_user_profiles p ON p.user_id = u.id
  15. {$r_join}
  16. WHERE u.is_locked = 0 AND u.is_deleted = 0
  17. {$this->inDB->where}
  18.  
  19. {$this->inDB->group_by}
  20.  
  21. {$this->inDB->order_by}\n";
Пробую выбирать только тех кто с Марса

  1. $sql = "SELECT
  2. u.id,
  3. u.login,
  4. u.nickname,
  5. u.icq,
  6. u.logdate as flogdate,
  7. u.rating,
  8. u.is_deleted as is_deleted,
  9. u.birthdate, u.rating,
  10. u.status as microstatus,
  11. p.city, p.cityid, p.state, p.region, p.country, p.countryid, p.karma, p.imageurl, p.where_from,
  12. p.gender as gender
  13.  
  14. FROM cms_users u
  15. INNER JOIN cms_user_profiles p ON p.user_id = u.id
  16. {$r_join}
  17. WHERE u.is_locked = 0 AND u.is_deleted = 0 WHERE p.where_from = '$mars'
  18.  
  19.  
  20.  
Результат — ОК.

Вижу в списке пользователей, только марсиан.

Пытаюсь вывести в списке соседей с Луны.

  1. $sql = "SELECT
  2. u.id,
  3. u.login,
  4. u.nickname,
  5. u.icq,
  6. u.logdate as flogdate,
  7. u.rating,
  8. u.is_deleted as is_deleted,
  9. u.birthdate, u.rating,
  10. u.status as microstatus,
  11. p.city, p.cityid, p.state, p.region, p.country, p.countryid, p.karma, p.imageurl, p.where_from,
  12. p.gender as gender
  13.  
  14. FROM cms_users u
  15. INNER JOIN cms_user_profiles p ON p.user_id = u.id
  16. {$r_join}
  17. WHERE u.is_locked = 0 AND u.is_deleted = 0 AND p.where_from = '$mars'
  18.  
  19. UNION
  20.  
  21. SELECT
  22. u.id,
  23. u.login,
  24. u.nickname,
  25. u.icq,
  26. u.logdate as flogdate,
  27. u.rating,
  28. u.is_deleted as is_deleted,
  29. u.birthdate, u.rating,
  30. u.status as microstatus,
  31. p.city, p.cityid, p.state, p.region, p.country, p.countryid, p.karma, p.imageurl, p.where_from,
  32. p.gender as gender
  33.  
  34. FROM cms_users u
  35. INNER JOIN cms_user_profiles p ON p.user_id = u.id
  36. {$r_join}
  37. WHERE u.is_locked = 0 AND u.is_deleted = 0 AND p.where_from = '$moon'
И всё. В списке пользователей один пользователь с нулевым id.

Где то при дальнейшей обработке результатов запроса, вероятно возникает какой то конфликт. Кто нибудь может подсказать в чем может быть проблема?
#2 17 сентября 2016 в 19:53
Нил™,
Так Вы ж юниоите таблицу саму к себе.
Может легче p.where_from IN (SELECT * FROM cms_users WHERE where_from = '$moon' OR where_from = '$mars')
#3 17 сентября 2016 в 20:17
Ris, нет, на самом деле смысл такой что в списке пользователей сначала люди из моего города, потом из моей области, потом из моей страны, потом все остальные. Немного не то же самое что либо марс либо луна.
В общем заработало всё, просто попробовал заново составить запрос, так и не понял в чем была проблема, наверно синтаксис где нибудь.
Спасибо ))
Коллективный разум сила)
#4 17 сентября 2016 в 21:33

в списке пользователей сначала люди из моего города, потом из моей области, потом из моей страны, потом все остальные.

Нил™

По такой логике запрос выдаст всё содержимое таблицы.
Вопрос только в порядке вывода.
#5 17 сентября 2016 в 22:17

По такой логике запрос выдаст всё содержимое таблицы.
Вопрос только в порядке вывода.

Ris
Ну сортировка тоже присутствует, просто не стал приводить её здесь в примере, потому что ошибка возникала и без её использования тоже. Сейчас в запросе сортировка присутствует, сначала по городу, потом по региону, потом по стране и по дате последнего логина, всё ок.


  1. $sql = "SELECT
  2. u.id,
  3. u.login,
  4. u.nickname,
  5. u.icq,
  6. u.logdate as flogdate,
  7. u.rating,
  8. u.is_deleted as is_deleted,
  9. u.birthdate, u.rating,
  10. u.status as microstatus,
  11. p.city, p.cityid, p.state, p.region, p.country, p.countryid, p.karma, p.imageurl,
  12. p.gender as gender
  13. FROM cms_users u
  14. INNER JOIN cms_user_profiles p ON p.user_id = u.id
  15. {$r_join}
  16. WHERE u.is_locked = 0 AND u.is_deleted = 0 AND p.city = '$user_city'
  17. UNION
  18. SELECT
  19. u.id,
  20. u.login,
  21. u.nickname,
  22. u.icq,
  23. u.logdate as flogdate,
  24. u.rating,
  25. u.is_deleted as is_deleted,
  26. u.birthdate, u.rating,
  27. u.status as microstatus,
  28. p.city, p.cityid, p.state, p.region, p.country, p.countryid, p.karma, p.imageurl,
  29. p.gender as gender
  30. FROM cms_users u
  31. INNER JOIN cms_user_profiles p ON p.user_id = u.id
  32. {$r_join}
  33. WHERE u.is_locked = 0 AND u.is_deleted = 0 AND p.state = '$user_state'
  34. UNION
  35. SELECT
  36. u.id,
  37. u.login,
  38. u.nickname,
  39. u.icq,
  40. u.logdate as flogdate,
  41. u.rating,
  42. u.is_deleted as is_deleted,
  43. u.birthdate, u.rating,
  44. u.status as microstatus,
  45. p.city, p.cityid, p.state, p.region, p.country, p.countryid, p.karma, p.imageurl,
  46. p.gender as gender
  47. FROM cms_users u
  48. INNER JOIN cms_user_profiles p ON p.user_id = u.id
  49. {$r_join}
  50. WHERE u.is_locked = 0 AND u.is_deleted = 0 AND p.country = '$user_country'
  51. ORDER BY FIELD (city, '$user_city') DESC, FIELD (state, '$user_state') DESC, FIELD (country, '$user_country') DESC, flogdate DESC
  52. ";
Резульат тот, что мне был нужен.
#6 17 сентября 2016 в 22:44
Нил™,

А вот результат такого запроса сильно другой будет?

  1. SELECT u.*, p.* FROM cms_users u
  2. JOIN cms_user_profiles p ON p.user_id = u.id
  3. WHERE u.is_locked = 0 AND u.is_deleted = 0 AND p.country = '$user_country'
  4. ORDER BY FIELD (p.city, '$user_city') DESC, FIELD (p.state, '$user_state') DESC, FIELD (p.country, '$user_country') DESC, u.logdate DESC
Кстати, а откуда в таблице cms_user_profiles поля state и country ?
Это какая версия первой ветки?
#7 17 сентября 2016 в 22:54

А вот результат такого запроса сильно другой будет?

Ris
в списке один пользователь с нулевым id)

Это какая версия первой ветки?

Ris
1.10.6 просто я область и страну пишу в таблицу cms_user_profiles
#8 17 сентября 2016 в 23:05
Нил™,

Понял. Возможно я чего-то не углядел. Проверить не имею возможности, так как не обладаю такой замечательной таблицей.
Но чисто логически — никакой разницы.

Я там сначала букву u забыл дописать, как элиас.
Попробуйте еще раз, если не трудно.
И кстати, нет смысла перечислять все поля таблиц. Достаточно написать звездочку *
#9 17 сентября 2016 в 23:17

Попробуйте еще раз, если не трудно.

Ris
попробовал, не работает.

не обладаю такой замечательной таблицей

Ris
у вас ещё всё впереди…
#10 18 сентября 2016 в 02:33
Ris, вы были совершенно правы наcчет того, что я перемудрил с UNION

  1. $sql = "SELECT
  2. u.id,
  3. u.login,
  4. u.nickname,
  5. u.icq,
  6. u.logdate as flogdate,
  7. u.rating,
  8. u.is_deleted as is_deleted,
  9. u.birthdate, u.rating,
  10. u.status as microstatus,
  11. p.city, p.cityid, p.state, p.region, p.country, p.countryid, p.karma, p.imageurl,
  12. p.gender as gender
  13. FROM cms_users u
  14. INNER JOIN cms_user_profiles p ON p.user_id = u.id
  15. {$r_join}
  16. WHERE u.is_locked = 0 AND u.is_deleted = 0
  17. ORDER BY FIELD (city, '$user_city') DESC, FIELD (state, '$user_state') DESC, FIELD (country, '$user_country') DESC, flogdate DESC
  18. ";
достаточно.

И ваш запрос из поста №6 тоже работает (не знаю почему при тестировании ранее выходила ошибка, невнимательность...)

Но оставлю тот, что здесь в посте, он ближе к оригинальному до правок)

WHERE p.country = '$user_country' лишнее, если хотим, что бы после юзеров из моей страны пошел общий список из других местоположений, просто выборка всех кто не удален и не заблокирован, а потом сортировка.
Спасибо за участие)
Вы не можете отвечать в этой теме.
Войдите или зарегистрируйтесь, чтобы писать на форуме.
Используя этот сайт, вы соглашаетесь с тем, что мы используем файлы cookie.