|
Тема |
Re: SQL заявка [re: aruseva] |
|
Автор |
salle (един такъв) |
|
Публикувано | 29.09.09 16:43 |
|
|
Мисля, че схващам какво искаш, но ще трябва да обясниш по-подробно структурата на таблиците и по точно какво може и какво не може да има в тях като данни . В зависимост от това решението е различно.
За целта да вземем един прост пример. Използвам MySQL, но таблицата е напълно стандартна.
CREATE TABLE t (x INT, y INT, PRIMARY KEY(x,y));
INSERT INTO t VALUES(1, 1), (1,4), (2,1), (3,1),(3,4), (4,4), (5,2);
SELECT * FROM t;
+---+---+
| x | y |
+---+---+
| 1 | 1 |
| 1 | 4 |
| 2 | 1 |
| 3 | 1 |
| 3 | 4 |
| 4 | 4 |
| 5 | 2 |
+---+---+
7 rows in set (0.00 sec)
Ако правилно съм те разбрал задачката е да извадим тези x за които има редове с и y=1 и y=4 т.е. в този случай x = 1 и x = 3
Решението за общия случай по-добре е JOIN на таблицата към самата себе си толкова пъти колкото стойности на y ни трябват. В случая:
SELECT t1.x FROM t AS t1, t AS t2 WHERE t1.x = t2.x AND t1.y = 1 AND t2.y = 4;
+---+
| x |
+---+
| 1 |
| 3 |
+---+
За да разбереш откъде идва резултатът ето оттук:
mysql> SELECT * FROM t AS t1, t AS t2 WHERE t1.x = t2.x;
+---+---+---+---+
| x | y | x | y |
+---+---+---+---+
| 1 | 1 | 1 | 1 |
| 1 | 1 | 1 | 4 |
| 1 | 4 | 1 | 1 |
| 1 | 4 | 1 | 4 |
| 2 | 1 | 2 | 1 |
| 3 | 1 | 3 | 1 |
| 3 | 1 | 3 | 4 |
| 3 | 4 | 3 | 1 |
| 3 | 4 | 3 | 4 |
| 4 | 4 | 4 | 4 |
| 5 | 2 | 5 | 2 |
+---+---+---+---+
11 rows in set (0.00 sec)
mysql> SELECT * FROM t AS t1, t AS t2 WHERE t1.x = t2.x AND t1.y = 1;
+---+---+---+---+
| x | y | x | y |
+---+---+---+---+
| 1 | 1 | 1 | 1 |
| 1 | 1 | 1 | 4 |
| 2 | 1 | 2 | 1 |
| 3 | 1 | 3 | 1 |
| 3 | 1 | 3 | 4 |
+---+---+---+---+
5 rows in set (0.00 sec)
SELECT * FROM t AS t1, t AS t2 WHERE t1.x = t2.x AND t1.y = 1 AND t2.y = 4;
+---+---+---+---+
| x | y | x | y |
+---+---+---+---+
| 1 | 1 | 1 | 4 |
| 3 | 1 | 3 | 4 |
+---+---+---+---+
2 rows in set (0.00 sec)
Можеш ли оттук нататък да приложиш логиката върху твоята заявка?
Редактирано от salle на 29.09.09 16:45.
|
| |
|
|
|