如何根据相关表获取数据?

时间:2014-07-23 20:32:28

标签: mysql sql

Listings table
+------------+---------+
| name       | id      |
+------------+---------+
| Example 1  |  1      |
| Example 2  |  2      |
| Example 3  |  3      |
| Example 4  |  4      |
| Example 5  |  5      |
| Example 6  |  6      |
+------------+---------+

Categories table
+------------+---------+
| name       | id      |
+------------+---------+
| Catname 1  |  1      |
| Catname 2  |  2      |
| Catname 3  |  3      |
+------------+---------+

ListingCats table
+--------+---------+
| cat_id | list_id |
+--------+---------+
| 1      | 1       |
| 1      | 2       |
| 1      | 3       |
| 2      | 1       |
| 3      | 1       |
| 3      | 3       |
| 2      | 2       |
| 1      | 5       |
| 2      | 6       |
+--------+---------+

我正在尝试构建2个简单的查询。

首先需要计算清单表格中有多少列表与listcats表中的给定类别ID相关联。

第二部分是从清单表中获取所有数据(*),这些数据链接到listingcats表中的给定类别ID。

我尝试了很多连接,但由于某种原因,我们没有想要正常工作。任何人都可以根据上面给出的示例表帮助。 '给予'在这种情况下,类别ID将是' 1'。

2 个答案:

答案 0 :(得分:0)

对于第一个查询,您可以使用简单连接,并返回计数

SELECT COUNT(Name)
FROM Listings l
JOIN ListingCats lc ON l.id = lc.cat_id
WHERE lc.cat_id = 1

这将返回listing表中的所有行,以使列表id在listingcats表中具有相应的cat_id,但对于cat_id为1的那些行是独占的。然后,count聚合函数返回行数。 / p>

对于第二个,您可以使用上面的相同子查询,但没有聚合函数,并选择所有值。

SELECT * FROM Listings l
JOIN ListingCats lc ON l.id = lc.cat_id
WHERE lc.cat_id = 1

尝试这些,请告诉我他们是否有效,我会尝试与您一起解决这些问题。

修改

回顾这个问题后,如果给你一个特定的cat_id,你甚至不需要使用连接,你可以简单地在listing表中查询具有该id的那个。如果给定的id是1:

SELECT COUNT(Name)
FROM Listings l
WHERE l.id = 1

然后,第二个更广泛:

SELECT * FROM Listings l WHERE l.id = 1

答案 1 :(得分:0)

CREATE TABLE  `listings` (
  `id` int(10) unsigned NOT NULL auto_increment,
  `name` varchar(10) NOT NULL default '0',
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

CREATE TABLE  `categories` (
  `id` int(10) unsigned NOT NULL auto_increment,
  `name` varchar(10) NOT NULL default '0',
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

CREATE TABLE  `listings_cats` (
  `cat_id` int(10) unsigned NOT NULL,
  `list_id` int(10) unsigned NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1;


SELECT c.id, c.name, COUNT(lc.list_id) as the_count 
FROM categories c 
JOIN listings_cats lc ON (lc.cat_id = c.id) 
GROUP BY c.id;

SELECT l.id, l.name, c.name AS category_name 
FROM listings l JOIN listings_cats lc ON (lc.list_id = l.id) 
JOIN categories c ON (lc.cat_id = c.id);