SQL заявка
10 отговора
0 прегледа
SQL заявка
Здравейте!!!
проблемът ми е следният:
Имам следните две таблици:
[линк]
След изпълнение на тази заявка
SELECT Door_Type.ID_Doors, Door_Type.Name AS Type_Door, Door_Chela.ID_Door_Chela,Door_Chela.Name AS Name_Chela,
Korpus_Door_Type.ID_Korpus
FROM Korpus_Door_Type INNER JOIN
Door_Type ON Korpus_Door_Type.ID_Door_Type = Door_Type.ID_Doors INNER JOIN
Door_Chela ONKorpus_Door_Type.ID_Door_Chela = Door_Chela.ID_Door_Chela
WHERE (dbo.Korpus_Door_Type.ID_Korpus = 4)
Резултата е този:
[линк]
Кажете ми как трябва да ми изглежда заявката за да се показват само редовете маркирани в синьо. Т,е да се показват само тези резултати за ID_Doors , които имат ст-ти за ID_Door_Chela 1 4.
проблемът ми е следният:
Имам следните две таблици:
[линк]
След изпълнение на тази заявка
SELECT Door_Type.ID_Doors, Door_Type.Name AS Type_Door, Door_Chela.ID_Door_Chela,Door_Chela.Name AS Name_Chela,
Korpus_Door_Type.ID_Korpus
FROM Korpus_Door_Type INNER JOIN
Door_Type ON Korpus_Door_Type.ID_Door_Type = Door_Type.ID_Doors INNER JOIN
Door_Chela ONKorpus_Door_Type.ID_Door_Chela = Door_Chela.ID_Door_Chela
WHERE (dbo.Korpus_Door_Type.ID_Korpus = 4)
Резултата е този:
[линк]
Кажете ми как трябва да ми изглежда заявката за да се показват само редовете маркирани в синьо. Т,е да се показват само тези резултати за ID_Doors , които имат ст-ти за ID_Door_Chela 1 4.
Re: SQL заявка
"да се показват само тези резултати за ID_Doors , които имат ст-ти за ID_Door_Chela 1 4."
се превежда като
... AND Door_Chela.ID_Door_Chela =1
или
... AND Door_Chela.ID_Door_Chela =1
или
... AND Door_Chela.ID_Door_Chela IN(1,4)
във WHERE в зависимост от това какво точно искаш
salle.online.bg/sig
се превежда като
... AND Door_Chela.ID_Door_Chela =1
или
... AND Door_Chela.ID_Door_Chela =1
или
... AND Door_Chela.ID_Door_Chela IN(1,4)
във WHERE в зависимост от това какво точно искаш
salle.online.bg/sig
Re: SQL заявка
Да не съм се изразира правило . Искам да се показват само тези резултатите които за едно и също ID_Doors имат едновременно ст-ти на ID_Door_Chela 1 и 4.
от резултата на второто изображение искам да изведа само сините полета. Тези със стойност на ID_Doors = 2 и 13, защото само те имат ID_Doors_Chelo едновремено записи със ID_Doors = 1 и 4.
Door_Chela.ID_Door_Chela IN(1,4) извежда всички записи за ID_Doors както съм ги показала, а аз искам да сортирам само някой от тях....
Оххх нещо и аз не мога да го обесня май както трябва, дано някой да успее да ме разбере
от резултата на второто изображение искам да изведа само сините полета. Тези със стойност на ID_Doors = 2 и 13, защото само те имат ID_Doors_Chelo едновремено записи със ID_Doors = 1 и 4.
Door_Chela.ID_Door_Chela IN(1,4) извежда всички записи за ID_Doors както съм ги показала, а аз искам да сортирам само някой от тях....
Оххх нещо и аз не мога да го обесня май както трябва, дано някой да успее да ме разбере
Re: SQL заявка
"Искам да се показват само тези резултатите които за едно и също ID_Doors имат едновременно ст-ти на ID_Door_Chela 1 и 4"
Как ще стане това ID_Door_Chela да е 1 и 4 едновременно?
Ако под едновременно разбираш в един и същи ред това очевидно е невъзможно. Ако разбираш нещо друго ... обясни.
salle.online.bg/sig
Как ще стане това ID_Door_Chela да е 1 и 4 едновременно?
Ако под едновременно разбираш в един и същи ред това очевидно е невъзможно. Ако разбираш нещо друго ... обясни.
salle.online.bg/sig
Редактирано от salle на
Re: SQL заявка
да не може едновременно ID_Door_Chela да има ст-ст 1 и 4
просто искам да се сортират само тези редове за ID_Doors който имат ст-ст за ID_Door_Chelo както 1 така и 4 . Примерно ред 3 не отговаря на условието защото няма запис при който ID_Door_Chela = 4 и ID_Doors = 1
просто искам да се сортират само тези редове за ID_Doors който имат ст-ст за ID_Door_Chelo както 1 така и 4 . Примерно ред 3 не отговаря на условието защото няма запис при който ID_Door_Chela = 4 и ID_Doors = 1
Re: SQL заявка
Мисля, че схващам какво искаш, но ще трябва да обясниш по-подробно структурата на таблиците и по точно какво може и какво не може да има в тях като данни . В зависимост от това решението е различно.
За целта да вземем един прост пример. Използвам 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.online.bg/sig
За целта да вземем един прост пример. Използвам 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.online.bg/sig
Редактирано от salle на
Re: SQL заявка
И за да демонстрирам защо структурата и съдържанието са от значение ето едно хакерско решение за примера който използвам:
SELECT x FROM t WHERE y IN (1,4) GROUP BY x HAVING COUNT(*) = 2;
+---+
| x |
+---+
| 1 |
| 3 |
+---+
2 rows in set (0.00 sec)
В случая използвам, че PRIMARY KEY(x, y) следователно y IN (1,4) ще върне максимум 2 реда за всяко x.
salle.online.bg/sig
SELECT x FROM t WHERE y IN (1,4) GROUP BY x HAVING COUNT(*) = 2;
+---+
| x |
+---+
| 1 |
| 3 |
+---+
2 rows in set (0.00 sec)
В случая използвам, че PRIMARY KEY(x, y) следователно y IN (1,4) ще върне максимум 2 реда за всяко x.
salle.online.bg/sig
Re: SQL заявка
Salle, благодаря ти многоооо

Това което си ми предложил със Join към таблицата Korpus_Door_Type много ми помогна и всичко се получи така както го исках.
Отностно структурата на таблиците.
Таблицата Korpus_Door_Type съдържа 4 полета
1)ID_Korpus_Door_Type от тип integer - което е primary key
2) ID_Korpus от тип integer
3)ID_Door_Type от тип integer
4)ID_Door_Chela от тип integer
Отново мн ти благодаря , че имаше търпение и ме разбра какво точно искам да постигна.
Това което си ми предложил със Join към таблицата Korpus_Door_Type много ми помогна и всичко се получи така както го исках.
Отностно структурата на таблиците.
Таблицата Korpus_Door_Type съдържа 4 полета
1)ID_Korpus_Door_Type от тип integer - което е primary key
2) ID_Korpus от тип integer
3)ID_Door_Type от тип integer
4)ID_Door_Chela от тип integer
Отново мн ти благодаря , че имаше търпение и ме разбра какво точно искам да постигна.
Re: SQL заявка
Е аз бавно загрявам затова ми трябва много търпение.
И недей да се занимаваш с бази данни в 23:12. Нищо добро не излиза от това.
salle.online.bg/sig
И недей да се занимаваш с бази данни в 23:12. Нищо добро не излиза от това.
salle.online.bg/sig
Re: SQL заявка
>> Това което си ми предложил със Join към таблицата Korpus_Door_Type много ми помогна и всичко се получи така както го исках. <<
Случайно е!
За да не ни обясняваш коя колона е integer, което е важно, но е крайно недостатъчно, следващия път ни дай коректен DDL на таблиците. Т.е. нещо такова:
CREATE TABLE Korpus_Door_Type (
ID_Korpus_Door_Type INT PRIMARY KEY,
ID_Korpus INT ...
)
Толкова ли е сложно? Не! За сметка на това е абсолютно еднозначно и объркване не може да стане (особено от хора като salle). Най-много да открием, че си пропуснала да сложиш UNIQUE CONSTRAINT по (ID_Door_Type, ID_Door_Chela) за което salle те предупред , че решението му може да "разпери" редове. Сигурен съм, че не ти е направило никакво впечатление, че в неговия пример той има PRIMARY KEY(x,y) -- защо ли го е сложил?
Повтарям: обзалагам се, че решението ти работи по случайност :-))
cheers,
</wqw>
[линк]
Случайно е!
За да не ни обясняваш коя колона е integer, което е важно, но е крайно недостатъчно, следващия път ни дай коректен DDL на таблиците. Т.е. нещо такова:
CREATE TABLE Korpus_Door_Type (
ID_Korpus_Door_Type INT PRIMARY KEY,
ID_Korpus INT ...
)
Толкова ли е сложно? Не! За сметка на това е абсолютно еднозначно и объркване не може да стане (особено от хора като salle). Най-много да открием, че си пропуснала да сложиш UNIQUE CONSTRAINT по (ID_Door_Type, ID_Door_Chela) за което salle те предупред , че решението му може да "разпери" редове. Сигурен съм, че не ти е направило никакво впечатление, че в неговия пример той има PRIMARY KEY(x,y) -- защо ли го е сложил?
Повтарям: обзалагам се, че решението ти работи по случайност :-))
cheers,
</wqw>
[линк]