SQL заявка

10 отговора 0 прегледа
#1

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.

Отговор
в отговор на aruseva #2

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
Отговор
в отговор на salle #3

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 както съм ги показала, а аз искам да сортирам само някой от тях....

Оххх нещо и аз не мога да го обесня май както трябва, дано някой да успее да ме разбере

Отговор
в отговор на aruseva #4

Re: SQL заявка

"Искам да се показват само тези резултатите които за едно и също ID_Doors имат едновременно ст-ти на ID_Door_Chela 1 и 4"

Как ще стане това ID_Door_Chela да е 1 и 4 едновременно?

Ако под едновременно разбираш в един и същи ред това очевидно е невъзможно. Ако разбираш нещо друго ... обясни.

salle.online.bg/sig

Редактирано от salle на

Отговор
в отговор на salle #5

Re: SQL заявка

да не може едновременно ID_Door_Chela да има ст-ст 1 и 4
просто искам да се сортират само тези редове за ID_Doors който имат ст-ст за ID_Door_Chelo както 1 така и 4 . Примерно ред 3 не отговаря на условието защото няма запис при който ID_Door_Chela = 4 и ID_Doors = 1

Отговор
в отговор на aruseva #6

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

Редактирано от salle на

Отговор
в отговор на salle #7

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
Отговор
в отговор на salle #8

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

Отново мн ти благодаря , че имаше търпение и ме разбра какво точно искам да постигна.

Отговор
в отговор на aruseva #9

Re: SQL заявка

Е аз бавно загрявам затова ми трябва много търпение.

И недей да се занимаваш с бази данни в 23:12. Нищо добро не излиза от това.

salle.online.bg/sig
Отговор
в отговор на salle #10

Re: SQL заявка

е понякога се получават нещата ;)
както тази вечер

Отговор
в отговор на aruseva #11

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>

[линк]
Отговор