Greetings,

This is driving me crazy.

I'm running MySQL 4.0.15-standard.

I've got a db that tracks switches, servers they connect to, and connections
between switches.

Schema for server:
+----------------------+----------------------------------------------------
------+
| Field                | Type             | Null | Key | Default | Extra
|
+----------------------+------------------+------+-----+---------+----------
------+
| server_id            | int(10) unsigned |      | PRI | NULL    |
auto_increment |
| customer_id          | int(10) unsigned | YES  | MUL | NULL    |
|
| rack_id              | int(10) unsigned |      | MUL | 0       |
|
| distance_from_bottom | int(10) unsigned | YES  |     | NULL    |
|
| switch_id            | int(10) unsigned |      | MUL | 0       |
|
| switch_port          | int(10) unsigned |      |     | 0       |
|
| size                 | int(10) unsigned | YES  |     | NULL    |
|
| label                | varchar(50)      |      |     |         |
|
| base_hostname        | varchar(50)      |      |     |         |
|
| base_ip              | varchar(50)      |      |     |         |
|
| access_info          | text             | YES  |     | NULL    |
|
| monitor              | tinytext         | YES  |     | NULL    |
|
| hardware             | text             | YES  |     | NULL    |
|
| addsoft              | tinytext         | YES  |     | NULL    |
|
+----------------------+----------------------------------------------------
------+

Schema for switch:

+----------------------+------------------+------+-----+---------+----------
------+
| Field                | Type             | Null | Key | Default | Extra
|
+----------------------+------------------+------+-----+---------+----------
------+
| switch_id            | int(10) unsigned |      | PRI | NULL    |
auto_increment |
| rack_id              | int(10) unsigned |      | MUL | 0       |
|
| name                 | varchar(10)      | YES  |     | NULL    |
|
| ports                | int(10) unsigned | YES  |     | NULL    |
|
| mrtg_prefix          | varchar(30)      | YES  |     | NULL    |
|
| size                 | int(10) unsigned | YES  |     | NULL    |
|
| distance_from_bottom | int(10) unsigned | YES  |     | NULL    |
|
+----------------------+------------------+------+-----+---------+----------
------+

Schema for switch_connect:

+--------------+------------------+------+-----+---------+-------+
| Field        | Type             | Null | Key | Default | Extra |
+--------------+------------------+------+-----+---------+-------+
| switch_id    | int(10) unsigned |      | MUL | 0       |       |
| switch_port  | int(10) unsigned |      |     | 0       |       |
| switch2_id   | int(10) unsigned |      | MUL | 0       |       |
| switch2_port | int(10) unsigned |      |     | 0       |       |
+--------------+------------------+------+-----+---------+-------+

The switch_connect table tracks connections between two switches:

mysql> select * from switch_connect;
+-----------+-------------+------------+--------------+
| switch_id | switch_port | switch2_id | switch2_port |
+-----------+-------------+------------+--------------+
|         1 |          29 |          2 |            1 |
|         1 |          28 |          5 |            1 |
|         1 |          30 |          4 |            1 |
|         1 |          32 |          3 |            1 |
+-----------+-------------+------------+--------------+

Now, I'm trying to get a count of used ports on switches.  I was getting
some weird results, and have broken it down this far:

mysql> SELECT
    ->  switch.switch_id,
    ->  switch.rack_id,
    ->  switch.ports,
    ->  COUNT(switch_connect1.switch_id) AS left_port_count,
    ->  COUNT(switch_connect2.switch2_id) AS right_port_count,
    ->  COUNT(server.server_id) AS server_port_count
    -> FROM switch
    -> LEFT JOIN
    ->  switch_connect AS switch_connect1 ON (switch.switch_id =
switch_connect1.switch_id)
    -> LEFT JOIN
    ->  switch_connect AS switch_connect2 ON (switch.switch_id =
switch_connect2.switch2_id)
    -> LEFT JOIN
    ->  server ON (switch.switch_id = server.switch_id) 
    -> GROUP BY switch.switch_id;
+-----------+---------+-------+-----------------+------------------+--------
-----------+
| switch_id | rack_id | ports | left_port_count | right_port_count |
server_port_count |
+-----------+---------+-------+-----------------+------------------+--------
-----------+
|         1 |       1 |    48 |               4 |                0 |
0 |
|         2 |       2 |    24 |               0 |                3 |
3 |
|         3 |      49 |    24 |               0 |               17 |
17 |
|         4 |      43 |    24 |               0 |               19 |
19 |
|         5 |      45 |    24 |               0 |               19 |
19 |
|         6 |       3 |    24 |               0 |                0 |
9 |
|         7 |       4 |    24 |               0 |                0 |
9 |
|         8 |       5 |    24 |               0 |                0 |
10 |
<snip>
+-----------+---------+-------+-----------------+------------------+--------
-----------+

Switch_id's 2-5 all have an entry in switch_connect table.
The right port count for switch_id's 2-5 should be 1.  No more than one.
Instead, it's the same as server_port_count.

If I remove the server_port_count and leave left join server in, I get the
same problem in the right_port_count column.

When I remove the server_port_count column AND the server table from the
join, I get the correct result for the right_port_count:

mysql> SELECT
    ->  switch.switch_id,
    ->  switch.rack_id,
    ->  switch.ports,
    ->  COUNT(switch_connect1.switch_id) AS left_port_count,
    ->  COUNT(switch_connect2.switch2_id) AS right_port_count
    -> FROM switch
    -> LEFT JOIN
    ->  switch_connect AS switch_connect1 ON (switch.switch_id =
switch_connect1.switch_id)
    -> LEFT JOIN
    ->  switch_connect AS switch_connect2 ON (switch.switch_id =
switch_connect2.switch2_id)
    -> GROUP BY switch.switch_id;

+-----------+---------+-------+-----------------+------------------+
| switch_id | rack_id | ports | left_port_count | right_port_count |
+-----------+---------+-------+-----------------+------------------+
|         1 |       1 |    48 |               4 |                0 |
|         2 |       2 |    24 |               0 |                1 |
|         3 |      49 |    24 |               0 |                1 |
|         4 |      43 |    24 |               0 |                1 |
|         5 |      45 |    24 |               0 |                1 |
|         6 |       3 |    24 |               0 |                0 |
|         7 |       4 |    24 |               0 |                0 |
|         8 |       5 |    24 |               0 |                0 |
<snip>
+-----------+---------+-------+-----------------+------------------+


I've been pounding my head against this for a while now - can anyone offer
any illumination as to what exactly I'm screwing up?

I'd prefer not to do any major schema re-altering, but if I must, I must.

Brandon Ewing



-- 
MySQL General Mailing List
For list archives: http://lists.mysql.com/mysql
To unsubscribe:    http://lists.mysql.com/[EMAIL PROTECTED]

Reply via email to