Actually, after thinking a little bit, a better way to do it... for demonstration purposes, I created three tables: [b]info[/b] ----- [i]info_id[/i] int unsigned auto_increment primary [i]name[/i] text [b]info_types[/b] ----- [i]Info_TypeId[/i] int unsigned auto_increment primary [i]description[/i] text info_assign ----- info_id int unsigned Info_TypeId int unsigned You can then use the following SQL statement: SELECT info.name, info_types.description FROM info_assign, info, info_types WHERE info_assign.info_id = info.info_id AND info_assign.Info_TypeId = info_types.Info_TypeId There are a couple of advantages to this method. First, you can have an as many info types per info item as you want (not limited to just 3). The disadvantage is that you'll need a little extra care to prevent duplicating the info.name field. I'd do it something like this: [code] $sql = "SELECT info.info_id, info.name, info_types.description FROM info_assign, info, info_types WHERE info_assign.info_id = info.info_id AND info_assign.Info_TypeId = info_types.Info_TypeId"; $db = mysql_connect(...connection info); mysql_select_db($dbName); $q = mysql_query($sql, $db); $list = array(); $names = array(); while ($data = mysql_fetch_assoc($q)) { if (!is_array($list[$data['info_id']])) { $list[$data['info_id']] = array(); } $list[$data['info_id']][] = $data['description']; $names[$data['info_id']] = $data['name']; } foreach ($names as $id => $name) { echo "$name<ul>"; foreach ($list[$id] as $infoType) { echo "<li>$infoType</li>"; } echo '</ul>'; } [/code] The results will be a list of all of your info names followed by a bullet list of all the info types assigned to that info name.