Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Скриптовые языки программирования > PHP
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 22.05.2013, 00:13   #1
deemka777
Пользователь
 
Регистрация: 22.02.2011
Сообщений: 38
По умолчанию запрос select

Имеется 3 таблицы(идентичные по столбцам и названием столбцов)
table1, table2, table3
у всех этих таблиц есть столбец с одинаковым названием colomn_zzz (числовое поле)
table1
name | colomn_zzz
вася | 12
петя | 14
женя | 8

table2
name | colomn_zzz
оля | 11
иван| 10
николай | 18

table3
name | colomn_zzz
марина | 16
ира| 7
сергей | 14

не могу сделать правильный запрос чтобы выбрать 5 максимальных значений изо всех таблиц

результат:
name | colomn_zzz
николай | 18
марина | 16
петя | 14
сергей | 14
вася | 12

в инет нашел только как сделать запрос с одинаковыми полями.

SELECT * FROM table1 JOIN table2 JOIN table3 ORDER BY colomn_zzz DESC LIMIT 5
deemka777 вне форума Ответить с цитированием
Старый 22.05.2013, 00:55   #2
deemka777
Пользователь
 
Регистрация: 22.02.2011
Сообщений: 38
По умолчанию

решил вот так

SELECT * FROM (SELECT * FROM table1 UNION SELECT * FROM table2 UNION SELECT * FROM table3) as t ORDER BY colomn_zzz DESC LIMIT 5

может как-то проще можно?

есть одно но!
если например в табл1 и табл2 значение полностью идентичны
табл1
сергей | 14

табл2
сергей | 14

то в результате вижу только 1 из этих двух значений(в теории таких совпадений у меня не должно быть, но всякое может быть)
результат (должен быть)
сергей | 14
сергей | 14

в итоге
сергей | 14

Последний раз редактировалось deemka777; 22.05.2013 в 00:57. Причина: уточнение
deemka777 вне форума Ответить с цитированием
Старый 22.05.2013, 10:17   #3
Andkorol
Старожил
 
Регистрация: 31.05.2010
Сообщений: 3,301
По умолчанию

Цитата:
Сообщение от deemka777 Посмотреть сообщение
решил вот так
SELECT * FROM (SELECT * FROM table1 UNION SELECT * FROM table2 UNION SELECT * FROM table3) as t ORDER BY colomn_zzz DESC LIMIT 5
может как-то проще можно?
Можно и нужно – указать в UNION-запросах ORDER BY и LIMIT 5:
PHP код:
mysqlSELECT FROM
    
-> (
    ->   (
SELECT FROM `table1ORDER BY `colomn_zzzDESC LIMIT 5)
    -> 
UNION
    
->   (SELECT FROM `table2ORDER BY `colomn_zzzDESC LIMIT 5)
    -> 
UNION
    
->   (SELECT FROM `table3ORDER BY `colomn_zzzDESC LIMIT 5)
    -> ) 
    -> 
AS `result_table`
    -> 
ORDER BY `colomn_zzzDESC
    
-> LIMIT 5;
+----+----------------+------------+
id name           colomn_zzz |
+----+----------------+------------+
|  
николай        |         18 |
|  
марина         |         16 |
|  
петя           |         14 |
|  
сергей         |         14 |
|  
вася           |         12 |
+----+----------------+------------+
5 rows in set (0.01 sec
Цитата:
Сообщение от deemka777 Посмотреть сообщение
есть одно но!
если например в табл1 и табл2 значение полностью идентичны
табл1
сергей | 14

табл2
сергей | 14

то в результате вижу только 1 из этих двух значений(в теории таких совпадений у меня не должно быть, но всякое может быть)
результат (должен быть)
сергей | 14
сергей | 14

в итоге
сергей | 14
А это странно – я изменил в table1 петю на сергея – и получил правильный результат, 2 сергея в списке:
PHP код:
mysqlupdate table1 set name 'сергей' where name 'петя';
Query OK1 row affected (0.00 sec)
Rows matched1  Changed1  Warnings0

mysql
SELECT FROM
    
-> (
    ->   (
SELECT FROM `table1ORDER BY `colomn_zzzDESC LIMIT 5)
    -> 
UNION
    
->   (SELECT FROM `table2ORDER BY `colomn_zzzDESC LIMIT 5)
    -> 
UNION
    
->   (SELECT FROM `table3ORDER BY `colomn_zzzDESC LIMIT 5)
    -> ) 
    -> 
AS `result_table`
    -> 
ORDER BY `colomn_zzzDESC
    
-> LIMIT 5;
+----+----------------+------------+
id name           colomn_zzz |
+----+----------------+------------+
|  
николай        |         18 |
|  
марина         |         16 |
|  
сергей         |         14 |
|  
сергей         |         14 |
|  
вася           |         12 |
+----+----------------+------------+
5 rows in set (0.00 sec
Причем – даже ваш запрос возвращает такой же результат, 2 сергея в списке:
PHP код:
mysqlSELECT FROM 
    
-> (
    ->   
SELECT FROM table1
    
-> UNION
    
->   SELECT FROM table2
    
-> UNION 
    
->   SELECT FROM table3
    
-> )
    -> 
AS t
    
-> ORDER BY colomn_zzz DESC
    
-> LIMIT 5;
+----+----------------+------------+
id name           colomn_zzz |
+----+----------------+------------+
|  
николай        |         18 |
|  
марина         |         16 |
|  
сергей         |         14 |
|  
сергей         |         14 |
|  
вася           |         12 |
+----+----------------+------------+
5 rows in set (0.00 sec
Andkorol вне форума Ответить с цитированием
Старый 22.05.2013, 10:33   #4
eval
Подтвердите свой е-майл
 
Регистрация: 29.08.2012
Сообщений: 4,011
По умолчанию

Цитата:
результат (должен быть)
читать про UNION, тогда странности пропадут, появится понимание
eval вне форума Ответить с цитированием
Старый 22.05.2013, 11:13   #5
deemka777
Пользователь
 
Регистрация: 22.02.2011
Сообщений: 38
По умолчанию

Спасибо Andkorol за такой широкий ответ.

eval просто читать, и не ошибаться не реально.
deemka777 вне форума Ответить с цитированием
Старый 22.05.2013, 11:19   #6
eval
Подтвердите свой е-майл
 
Регистрация: 29.08.2012
Сообщений: 4,011
По умолчанию

Цитата:
просто читать, и не ошибаться не реально.
а 100% ошибаться если не читать, что и видно.
eval вне форума Ответить с цитированием
Старый 22.05.2013, 22:29   #7
Mortimoro
Форумчанин
 
Регистрация: 03.12.2010
Сообщений: 334
По умолчанию

eval, ты мне напоминаешь мою учительницу по информатике в 8 классе - пафоса немеряно, а практической пользы ноль.
Mortimoro вне форума Ответить с цитированием
Старый 22.05.2013, 22:33   #8
Andkorol
Старожил
 
Регистрация: 31.05.2010
Сообщений: 3,301
По умолчанию

Mortimoro +1
Andkorol вне форума Ответить с цитированием
Старый 22.05.2013, 22:42   #9
eval
Подтвердите свой е-майл
 
Регистрация: 29.08.2012
Сообщений: 4,011
По умолчанию

дет сад на выезде?
eval вне форума Ответить с цитированием
Старый 23.05.2013, 11:43   #10
deemka777
Пользователь
 
Регистрация: 22.02.2011
Сообщений: 38
По умолчанию

поделитесь своим опытным мнением! пжлст.

например:
у меня есть 50 таблиц, по 20 столбцов и 1000 строк.
из них я пытаюсь получить топ 100 по выше указанному примеру(например столбец_5).

1. если эти данные будут запрашиваться довольно часто(200-300 раз в день), какова будет нагрузка не базу(не пошлёт ли меня провайдер? )
2. лучшее преобразовать список топ в отдельную таблицу, и просто напросто выводить из неё результат?
3. ваше видение как это лучше сделать!
deemka777 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Простой SELECT запрос (но с использованием CASE) Form_13 SQL, базы данных 4 04.05.2013 17:40
Запрос Select Morgusha SQL, базы данных 26 06.06.2012 14:07
sql запрос select Olegka_ БД в Delphi 11 27.03.2011 16:55
select-запрос из трех таблиц AJlEKCA БД в Delphi 10 19.01.2011 01:38
ADO-MS SQL Не выполняется запрос SELECT Dj_SheLL Помощь студентам 10 23.11.2010 14:17