Регистрирайте се безплатно, за да използвате услугите на сайта! | Вход
Начало Новини ИТ Работа Форум Видео Уроци Скриптове WiFi точки MyLinks Mytech Още


Нова тема
UNION - ORDER BY и LIMIT
Тази тема е погледната 304 пъти
Добави темата към любими | Принтирай темата | Нова тема 
Публикувано на: 01.12.2008 16:34
zipopro
Шогун

Мнения: (764)

Немога да разбера едни неща за union:
1. когато съединим няколко таблици и после сложим Limit така:
(SELECT a FROM t1 WHERE a=10 AND B=1)
UNION
(SELECT a FROM t2 WHERE a=11 AND B=2)
LIMIT 10;
LIMIT на всички резултати от SELECT-тите ли го задава или на всеки селект по отделно? например имаме 10 a-та в таблиза t1 и 10 в таблица t2 и тогава ще ореже вторите 10 ли?
2. И при Order by нали трябва да се пишат имената на колонките от първия селект?


 
---------------------------
Потребител от: 20.12.06 | Всички уроци от zipopro | Всички скриптове от zipopro

Лъчезар Петров Лечев - 14 - Стара Загора - Уеб Програмист
Винчета, болчета гайкии...!
напиши eMail напиши лично съобщение виж профила на zipopro
Публикувано на: 02.12.2008 01:16
escapeboy
Чирак

Мнения: (15)

 Този отговор е маркиран като удовлетворителен!

LIMIT важи за общите резултати
Що се отнася до ORDER BY трябва да използваш alias* от първия SELECT (не съм сигурен как е на български alias)
CODE
1
2
3
4
5
(SELECT a AS alpha FROM t1 WHERE a=10 AND B=1)
UNION
(SELECT a FROM t2 WHERE a=11 AND B=2)
ORDER BY alpha
LIMIT
10;

това е за цялата заявка... иначе за отделните SELECT-и може също да им слагаш ORDER BY и LIMIT по нормалния начин, но имай впредвид, че UNION връща винаги неподреден списък, тоест ORDER BY в SELECT-ите има смисъл само с LIMIT

не съм mysql експерт, но дано съм помогнал :)

още info

EDIT CBeTHaX: alias до колкото знам може да се превежда като инстанция


 
---------------------------
Потребител от: 28.01.05 | Всички уроци от escapeboy | Всички скриптове от escapeboy

http://katsarov.seloto.net
напиши eMail напиши лично съобщение виж профила на escapeboy
Публикувано на: 02.12.2008 13:55
zipopro
Шогун

Мнения: (764)

Виж ейтози линк:
http://www.tutorialspoint.com/mysql/mysql-union-keyword.htm
Тач не пишат Alias или то alias се използва само когато даваме order by?


 
---------------------------
Потребител от: 20.12.06 | Всички уроци от zipopro | Всички скриптове от zipopro

Лъчезар Петров Лечев - 14 - Стара Загора - Уеб Програмист
Винчета, болчета гайкии...!
напиши eMail напиши лично съобщение виж профила на zipopro
Публикувано на: 02.12.2008 17:09
escapeboy
Чирак

Мнения: (15)

Цитат от zipopro@02.12.2008 13:55:
Виж ейтози линк:
http://www.tutorialspoint.com/mysql/mysql-union-keyword.htm
Тач не пишат Alias или то alias се използва само когато даваме order by?

alias е задължително за ORDER BY, но ORDER BY не е задължителен за alias :)
Идеята е да имаш по нещо да ги подредиш и евентуално да се избегне повтаряне на колони.


 
---------------------------
Потребител от: 28.01.05 | Всички уроци от escapeboy | Всички скриптове от escapeboy

http://katsarov.seloto.net
напиши eMail напиши лично съобщение виж профила на escapeboy
Публикувано на: 02.12.2008 18:21
zipopro
Шогун

Мнения: (764)

а добре какво ще рече тва да се избегне повтаряне на колони?
Ти като напишеш първия селект то не трябва ли 2-рия и 3-тия и т.н. да ти се подреждат с имената колоните на 1-вия? ей виж пак този линк и виж последното:
 
mysql> SELECT fname, lname, addr FROM prospect
-> UNION ALL
-> SELECT first_name, last_name, address FROM customer
-> UNION
-> SELECT company, '', street FROM vendor;
+-------------------+----------+------------------------+
| fname             | lname    | addr                   |
+-------------------+----------+------------------------+
| Peter             | Jones    | 482 Rush St., Apt. 402 |
| Bernice           | Smith    | 916 Maple Dr.          |
| Grace             | Peterson | 16055 Seminole Ave.    |
| Bernice           | Smith    | 916 Maple Dr.          |
| Walter            | Brown    | 8602 1st St.           |
| ReddyParts, Inc.  |          | 38 Industrial Blvd.    |
| Parts-to-go, Ltd. |          | 213B Commerce Park.    |
+-------------------+----------+------------------------+
Всички колони се обединяват под колоните на 1-вия исе изкарват така.


 
---------------------------
Потребител от: 20.12.06 | Всички уроци от zipopro | Всички скриптове от zipopro

Лъчезар Петров Лечев - 14 - Стара Загора - Уеб Програмист
Винчета, болчета гайкии...!
напиши eMail напиши лично съобщение виж профила на zipopro
Публикувано на: 03.12.2008 16:50
escapeboy
Чирак

Мнения: (15)

Имах впредвид, че ако не го бяха направили така с alias и направиш нещо от рода на
CODE
1
2
3
4
(SELECT id,name,user FROM users)
UNION
(SELECT id,pass,email FROM users2)
ORDER BY id
и ще излезне грешка.

Идеята ти звучи логично... да се ползват колоните от първия селект... но по документация ORDER BY си върви с alias. Никога не пречи да пробваш :P

(всъщност горната примерна заявка най-вероятно ще изгърми с "неизвестна колона") :)


 
---------------------------
Потребител от: 28.01.05 | Всички уроци от escapeboy | Всички скриптове от escapeboy

http://katsarov.seloto.net
напиши eMail напиши лично съобщение виж профила на escapeboy
Публикувано на: 03.12.2008 18:53
zipopro
Шогун

Мнения: (764)

Не знам тръгна ми... който желае сорса:
CODE
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?php

include "../config.inc.php";
$select_user = mysql_connect(DB_HOST, DB_USER, DB_PASS)or die(mysql_error());
$select_db = mysql_select_db(DB_NAME, $select_user)or die(mysql_error());
$chars = mysql_query("SET NAMES ".TABLES_CHARSET);

$sel = mysql_query("(SELECT `id`, `name` FROM `users`) UNION (SELECT `key`, `username` FROM `users2`) ORDER BY id")or die(mysql_error());

while ($row = mysql_fetch_array($sel))
{
   
echo "<br />".$row[id]." - ".$row[name]."<br />";
}

?>
Таблицата извадена от phpmyadmin със вмъкнатите данни:
CODE
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
DROP TABLE IF EXISTS `users`;
CREATE TABLE `users` (
 
`id` int(255) NOT NULL auto_increment,
 
`name` varchar(255) collate utf8_unicode_ci NOT NULL,
 
PRIMARY KEY  (`id`)
)
DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=3 ;

INSERT INTO `users` (`id`, `name`) VALUES
(1, 'name1'),
(5, 'name2');

DROP TABLE IF EXISTS `users2`;
CREATE TABLE `users2` (
 
`key` int(255) NOT NULL auto_increment,
 
`username` varchar(255) collate utf8_unicode_ci NOT NULL,
 
PRIMARY KEY  (`key`)
)
DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=5 ;

INSERT INTO `users2` (`key`, `username`) VALUES
(3, 'username1'),
(4, 'username2');


 
Това мнение е редактирано от zipopro на 03.12.2008 18:54
---------------------------
Потребител от: 20.12.06 | Всички уроци от zipopro | Всички скриптове от zipopro

Лъчезар Петров Лечев - 14 - Стара Загора - Уеб Програмист
Винчета, болчета гайкии...!
напиши eMail напиши лично съобщение виж профила на zipopro
 1 посетител чете тази тема (0 потребители и 1 гост)  
Активни потребители: ---
   




mytech.bg © 2004 - 2009 | Контакти | За реклама