Приветствую еще раз
Есть 2 таблицы, где хранятся nameservers для доменов и связи nameserver <=> domain. Каждый домен идентифицируется по ID. Nameserver по имени (ns) и айди (nid).
Задача: имея ID домена (table_nameids.id) вытащить для него из таблицы table_names имя "ns",
а так же, из таблицы table_nameids, достать max(nid_ind) - число доменов на этом неймсервере. И всё это - 1 запросом.
nid_ind - это int значение от 1 до числа НСов для данного домена.
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
mysql> show fields from table_names; (для просто хранятся названия nameserver-ов (ns) с их nID (nameserver ID))
+------------+-----------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+------------+-----------------+------+-----+---------+----------------+
| nid | int(9) unsigned | NO | PRI | NULL | auto_increment |
| ns | varchar(128) | NO | UNI | NULL | |
+------------+-----------------+------+-----+---------+----------------+
4 rows in set (0.00 sec)
mysql> show fields from table_nameids;
+---------+------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+---------+------------------+------+-----+---------+----------------+
| tid | int(10) unsigned | NO | PRI | NULL | auto_increment |
| id | int(9) unsigned | NO | MUL | 0 | |
| nid | int(9) unsigned | NO | MUL | 0 | |
| nid_ind | int(9) unsigned | NO | | 0 | |
| sig | int(9) unsigned | NO | | 0 | |
+---------+------------------+------+-----+---------+----------------+
здесь:
ID - айди домена, к которому эта запись относится
nid - айди неймсервера из table_names
nid_ind - пронумерованное от 1 до количества НСов поле. Если НСов 10, то будут записи с nid_ind от 1 до 10.
суть в том, что для получения числа НСов, делается запрос
select max(nid_ind) from table_nameids where nid=<nid>;
индексы вот такие:
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
mysql> show index from table_names;
+------------+------------+------------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment |
+------------+------------+------------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| table_names | 0 | PRIMARY | 1 | nid | A | 3752315 | NULL | NULL | | BTREE | | |
| table_names | 0 | ns | 1 | ns | A | 3752315 | NULL | NULL | | BTREE | | |
+------------+------------+------------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
4 rows in set (0.03 sec)
mysql> show index from table_nameids;
+--------------+------------+-------------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment |
+--------------+------------+-------------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| table_nameids | 0 | PRIMARY | 1 | tid | A | 200744144 | NULL | NULL | | BTREE | | |
| table_nameids | 0 | index_nid_id | 1 | nid | A | 18 | NULL | NULL | | BTREE | | |
| table_nameids | 0 | index_nid_id | 2 | id | A | 200744144 | NULL | NULL | | BTREE | | |
| table_nameids | 1 | index_id | 1 | id | A | 200744144 | NULL | NULL | | BTREE | | |
| table_nameids | 1 | index_nid_nid_ind | 1 | nid | A | 108217 | NULL | NULL | | BTREE | | |
| table_nameids | 1 | index_nid_nid_ind | 2 | nid_ind | A | 200744144 | NULL | NULL | | BTREE | | |
+--------------+------------+-------------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
Хочется сделать это 1 запросом.
Пока у меня запросы такие:
1.
select ns,table_names.nid from table_names,table_nameids where table_names.nid=table_nameids.nid and id=934;
что даёт мне
1.
2.
3.
4.
5.
6.
+----------------+-------+
| ns | nid |
+----------------+-------+
| ns58.1and1.com | 45769 |
| ns57.1and1.com | 45768 |
+----------------+-------+
далее, как мне тут посоветовали, делаю запрос
1.
2.
3.
4.
5.
6.
7.
8.
mysql> select max(nid_ind) as nid_ind from table_nameids where nid in (45768,45769) group by nid;
+---------+
| nid_ind |
+---------+
| 768769 |
| 768766 |
+---------+
2 rows in set (0.01 sec)
очень
хочется избавиться от 2х запросов и делать всё одним (по крайней мере, на уровне скрипта).
логически, проблема в том, что мне нужно
- сначала достать айди НСа "nid" из table_nameids по заданному ID.
- потом достать из table_nameids значения max(nid_ind) для полученно nid И еще достать ns из таблицы table_names для тех же полученных "nid".
очень буду признателен за помощь.