Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Составление SQL-запросов > Запрос к двум таблицам, одна из них - соотнесение


Автор: Win MK 32 13.2.2012, 13:38
Помогите пожалуйста
Код

SELECT count(*)
FROM a2l, atoms
WHERE a2l.a2l_atoms_id=atoms.atoms_id AND
    a2l.a2l_lexems_id = 1 AND
    atoms.atoms_clot = 1

Запрос возвращает
count(*)
1
Но реально должно быть не так мало, а больше. Вот что из себя представляют эти таблицы:
Код

CREATE TABLE a2l (
  a2l_id int(11) NOT NULL auto_increment,
  a2l_atoms_id int(11) NOT NULL,
  a2l_lexems_id int(11) NOT NULL,
  PRIMARY KEY  (a2l_id)
) ENGINE=InnoDB  DEFAULT CHARSET=cp1251 AUTO_INCREMENT=21 ;

INSERT INTO a2l (a2l_id, a2l_atoms_id, a2l_lexems_id) VALUES
(1, 1, 5),
(2, 1, 2),
(3, 1, 3),
(4, 2, 1),
(5, 2, 4),
(6, 3, 6),
(7, 3, 2),
(8, 4, 5),
(9, 4, 4),
(10, 4, 6),
(11, 5, 2),
(12, 5, 1),
(13, 5, 5),
(14, 6, 2),
(15, 6, 1),
(16, 7, 1),
(17, 7, 5),
(18, 8, 2),
(19, 8, 5),
(20, 8, 4);

CREATE TABLE atoms (
  atoms_id int(11) NOT NULL auto_increment,
  atoms_clot int(11) NOT NULL,
  atoms_temp int(11) default NULL,
  atoms_temp2 int(11) NOT NULL,
  atoms_number double NOT NULL,
  atoms_dimensions_id int(11) NOT NULL,
  PRIMARY KEY  (atoms_id)
) ENGINE=InnoDB  DEFAULT CHARSET=cp1251 AUTO_INCREMENT=9 ;

INSERT INTO atoms (atoms_id, atoms_clot, atoms_temp, atoms_temp2, atoms_number, atoms_dimensions_id) VALUES
(1, 1, 3, 0, 100, 1),
(2, 1, 2, 0, 100, 1),
(3, 0, 2, 0, 100, 1),
(4, 0, 3, 0, 100, 1),
(5, 0, 3, 0, 100, 1),
(6, 0, 2, 0, 100, 1),
(7, 0, 2, 0, 100, 1),
(8, 0, 3, 0, 100, 1);

CREATE TABLE lexems (
  lexems_id int(20) NOT NULL auto_increment,
  lexems_text varchar(100) NOT NULL,
  lexems_clot int(11) NOT NULL,
  lexems_id_db int(11) default NULL,
  lexems_in_clot int(11) default NULL,
  PRIMARY KEY  (lexems_id)
) ENGINE=InnoDB  DEFAULT CHARSET=cp1251 AUTO_INCREMENT=7 ;

INSERT INTO lexems (lexems_id, lexems_text, lexems_clot, lexems_id_db, lexems_in_clot) VALUES
(1, 'Самара', 1, 4, 0),
(2, 'СГАНУ', 1, 5, 0),
(3, 'ФИТ', 1, 1, 0),
(4, 'Ф-105', 0, 3, 0),
(5, '520 аудитория', 1, 5, 0),
(6, '2011', 0, 2, 0); 

Автор: Win MK 32 13.2.2012, 14:04
Сделаю пояснение.

Как сделать нужный мне запрос вместо приведенного? Дело вот в чем


SELECT COUNT(a2l_lexems_id) AS count FROM a2l WHERE a2l_lexems_id =1 

Такой запрос, который выдает - сколько раз лексема (таблица лексем - lexems) под номером 1 встречается в атомах (таблица атомов - это таблица atoms). 

А таблица a2l - это таблица соотнесения. Ведь лексема может только один раз встретиться в атоме, или ни разу.

Так вот, я пытаюсь создать запрос, который считает не просто сколько раз встречается лексема в БД, а считает только те случаи, где atoms_clot=1 в таблице atoms.

Автор: Zloxa 13.2.2012, 14:09
Цитата(Win MK 32 @  13.2.2012,  13:38 Найти цитируемый пост)
Но реально должно быть не так мало, а больше.

кртиерий
Цитата(Win MK 32 @  13.2.2012,  13:38 Найти цитируемый пост)
a2l.a2l_lexems_id = 1

отбирает
Код

(4, 2, 1),
(12, 5, 1),
(15, 6, 1),
(16, 7, 1),

Цитата(Win MK 32 @  13.2.2012,  13:38 Найти цитируемый пост)
a2l.a2l_atoms_id=atoms.atoms_id

соединяет к ранее отобранному
Код

(4, 2, 1),(2, 1, 2, 0, 100, 1),
(12, 5, 1),(5, 0, 3, 0, 100, 1),
(15, 6, 1),(6, 0, 2, 0, 100, 1),
(16, 7, 1),(7, 0, 2, 0, 100, 1),

критерий
Цитата(Win MK 32 @  13.2.2012,  13:38 Найти цитируемый пост)
atoms.atoms_clot = 1

оставляет только
Код

(4, 2, 1),(2, 1, 2, 0, 100, 1),


Все правильно, так, как и должно быть.  smile

Добавлено через 3 минуты и 22 секунды
Цитата(Win MK 32 @  13.2.2012,  14:04 Найти цитируемый пост)
Сделаю пояснение.

В вашем пояснении я ничего не полял  smile 

Автор: Akina 13.2.2012, 14:15
Цитата(Win MK 32 @  13.2.2012,  14:38 Найти цитируемый пост)
реально должно быть не так мало, а больше.

C какого перепуга больше?

Код

mysql> CREATE TABLE a2l (
    ->   a2l_id int(11) NOT NULL auto_increment,
    ->   a2l_atoms_id int(11) NOT NULL,
    ->   a2l_lexems_id int(11) NOT NULL,
    ->   PRIMARY KEY  (a2l_id)
    -> );
Query OK, 0 rows affected (0.41 sec)

mysql> INSERT INTO a2l (a2l_id, a2l_atoms_id, a2l_lexems_id) VALUES
    -> (1, 1, 5),
    -> (2, 1, 2),
    -> (3, 1, 3),
    -> (4, 2, 1),
    -> (5, 2, 4),
    -> (6, 3, 6),
    -> (7, 3, 2),
    -> (8, 4, 5),
    -> (9, 4, 4),
    -> (10, 4, 6),
    -> (11, 5, 2),
    -> (12, 5, 1),
    -> (13, 5, 5),
    -> (14, 6, 2),
    -> (15, 6, 1),
    -> (16, 7, 1),
    -> (17, 7, 5),
    -> (18, 8, 2),
    -> (19, 8, 5),
    -> (20, 8, 4);
Query OK, 20 rows affected (0.03 sec)
Records: 20  Duplicates: 0  Warnings: 0

mysql>
mysql> CREATE TABLE atoms (
    ->   atoms_id int(11) NOT NULL auto_increment,
    ->   atoms_clot int(11) NOT NULL,
    ->   atoms_temp int(11) default NULL,
    ->   atoms_temp2 int(11) NOT NULL,
    ->   atoms_number double NOT NULL,
    ->   atoms_dimensions_id int(11) NOT NULL,
    ->   PRIMARY KEY  (atoms_id)
    -> );
Query OK, 0 rows affected (0.09 sec)

mysql> INSERT INTO atoms (atoms_id, atoms_clot, atoms_temp, atoms_temp2, atoms_number, atoms_dimensions_id) VALUES
    -> (1, 1, 3, 0, 100, 1),
    -> (2, 1, 2, 0, 100, 1),
    -> (3, 0, 2, 0, 100, 1),
    -> (4, 0, 3, 0, 100, 1),
    -> (5, 0, 3, 0, 100, 1),
    -> (6, 0, 2, 0, 100, 1),
    -> (7, 0, 2, 0, 100, 1),
    -> (8, 0, 3, 0, 100, 1);
Query OK, 8 rows affected (0.03 sec)
Records: 8  Duplicates: 0  Warnings: 0

mysql> select * from a2l;
+--------+--------------+---------------+
| a2l_id | a2l_atoms_id | a2l_lexems_id |
+--------+--------------+---------------+
|      1 |            1 |             5 |
|      2 |            1 |             2 |
|      3 |            1 |             3 |
|      4 |            2 |             1 |
|      5 |            2 |             4 |
|      6 |            3 |             6 |
|      7 |            3 |             2 |
|      8 |            4 |             5 |
|      9 |            4 |             4 |
|     10 |            4 |             6 |
|     11 |            5 |             2 |
|     12 |            5 |             1 |
|     13 |            5 |             5 |
|     14 |            6 |             2 |
|     15 |            6 |             1 |
|     16 |            7 |             1 |
|     17 |            7 |             5 |
|     18 |            8 |             2 |
|     19 |            8 |             5 |
|     20 |            8 |             4 |
+--------+--------------+---------------+
20 rows in set (0.02 sec)

mysql> select * from atoms;
+----------+------------+------------+-------------+--------------+---------------------+
| atoms_id | atoms_clot | atoms_temp | atoms_temp2 | atoms_number | atoms_dimensions_id |
+----------+------------+------------+-------------+--------------+---------------------+
|        1 |          1 |          3 |           0 |          100 |                   1 |
|        2 |          1 |          2 |           0 |          100 |                   1 |
|        3 |          0 |          2 |           0 |          100 |                   1 |
|        4 |          0 |          3 |           0 |          100 |                   1 |
|        5 |          0 |          3 |           0 |          100 |                   1 |
|        6 |          0 |          2 |           0 |          100 |                   1 |
|        7 |          0 |          2 |           0 |          100 |                   1 |
|        8 |          0 |          3 |           0 |          100 |                   1 |
+----------+------------+------------+-------------+--------------+---------------------+
8 rows in set (0.00 sec)

mysql> select * from a2l where a2l.a2l_lexems_id = 1;
+--------+--------------+---------------+
| a2l_id | a2l_atoms_id | a2l_lexems_id |
+--------+--------------+---------------+
|      4 |            2 |             1 |
|     12 |            5 |             1 |
|     15 |            6 |             1 |
|     16 |            7 |             1 |
+--------+--------------+---------------+
4 rows in set (0.01 sec)

mysql> select * from atoms where atoms.atoms_clot = 1;
+----------+------------+------------+-------------+--------------+---------------------+
| atoms_id | atoms_clot | atoms_temp | atoms_temp2 | atoms_number | atoms_dimensions_id |
+----------+------------+------------+-------------+--------------+---------------------+
|        1 |          1 |          3 |           0 |          100 |                   1 |
|        2 |          1 |          2 |           0 |          100 |                   1 |
+----------+------------+------------+-------------+--------------+---------------------+
2 rows in set (0.00 sec)

mysql> SELECT *
    -> FROM a2l, atoms
    -> WHERE a2l.a2l_atoms_id=atoms.atoms_id AND
    ->     a2l.a2l_lexems_id = 1 AND
    ->     atoms.atoms_clot = 1;
+--------+--------------+---------------+----------+------------+------------+-------------+--------------+---------------------+
| a2l_id | a2l_atoms_id | a2l_lexems_id | atoms_id | atoms_clot | atoms_temp | atoms_temp2 | atoms_number | atoms_dimensions_id |
+--------+--------------+---------------+----------+------------+------------+-------------+--------------+---------------------+
|      4 |            2 |             1 |        2 |          1 |          2 |           0 |          100 |                   1 |
+--------+--------------+---------------+----------+------------+------------+-------------+--------------+---------------------+
1 row in set (0.00 sec)

mysql> SELECT count(*)
    -> FROM a2l, atoms
    -> WHERE a2l.a2l_atoms_id=atoms.atoms_id AND
    ->     a2l.a2l_lexems_id = 1 AND
    ->     atoms.atoms_clot = 1
    ->
    -> ;
+----------+
| count(*) |
+----------+
|        1 |
+----------+
1 row in set (0.00 sec)


Код

mysql> update  atoms set atoms_clot=1 where atoms_id > 5;
Query OK, 3 rows affected (0.05 sec)
Rows matched: 3  Changed: 3  Warnings: 0

mysql> select * from atoms;
+----------+------------+------------+-------------+--------------+---------------------+
| atoms_id | atoms_clot | atoms_temp | atoms_temp2 | atoms_number | atoms_dimensions_id |
+----------+------------+------------+-------------+--------------+---------------------+
|        1 |          1 |          3 |           0 |          100 |                   1 |
|        2 |          1 |          2 |           0 |          100 |                   1 |
|        3 |          0 |          2 |           0 |          100 |                   1 |
|        4 |          0 |          3 |           0 |          100 |                   1 |
|        5 |          0 |          3 |           0 |          100 |                   1 |
|        6 |          1 |          2 |           0 |          100 |                   1 |
|        7 |          1 |          2 |           0 |          100 |                   1 |
|        8 |          1 |          3 |           0 |          100 |                   1 |
+----------+------------+------------+-------------+--------------+---------------------+
8 rows in set (0.02 sec)

mysql> select * from atoms where atoms.atoms_clot = 1;
+----------+------------+------------+-------------+--------------+---------------------+
| atoms_id | atoms_clot | atoms_temp | atoms_temp2 | atoms_number | atoms_dimensions_id |
+----------+------------+------------+-------------+--------------+---------------------+
|        1 |          1 |          3 |           0 |          100 |                   1 |
|        2 |          1 |          2 |           0 |          100 |                   1 |
|        6 |          1 |          2 |           0 |          100 |                   1 |
|        7 |          1 |          2 |           0 |          100 |                   1 |
|        8 |          1 |          3 |           0 |          100 |                   1 |
+----------+------------+------------+-------------+--------------+---------------------+
5 rows in set (0.00 sec)

mysql> SELECT *
    -> FROM a2l, atoms
    -> WHERE a2l.a2l_atoms_id=atoms.atoms_id AND
    ->     a2l.a2l_lexems_id = 1 AND
    ->     atoms.atoms_clot = 1;
+--------+--------------+---------------+----------+------------+------------+-------------+--------------+---------------------+
| a2l_id | a2l_atoms_id | a2l_lexems_id | atoms_id | atoms_clot | atoms_temp | atoms_temp2 | atoms_number | atoms_dimensions_id |
+--------+--------------+---------------+----------+------------+------------+-------------+--------------+---------------------+
|      4 |            2 |             1 |        2 |          1 |          2 |           0 |          100 |                   1 |
|     15 |            6 |             1 |        6 |          1 |          2 |           0 |          100 |                   1 |
|     16 |            7 |             1 |        7 |          1 |          2 |           0 |          100 |                   1 |
+--------+--------------+---------------+----------+------------+------------+-------------+--------------+---------------------+
3 rows in set (0.00 sec)

mysql> SELECT count(*)
    -> FROM a2l, atoms
    -> WHERE a2l.a2l_atoms_id=atoms.atoms_id AND
    ->     a2l.a2l_lexems_id = 1 AND
    ->     atoms.atoms_clot = 1
    -> ;
+----------+
| count(*) |
+----------+
|        3 |
+----------+
1 row in set (0.00 sec)

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)