繁体   English   中英

在MySQL中,如何在内部联接中按值对表中的字段进行计数,然后将这些结果左联接至SELECT?

[英]In MySQL how do I count fields on a table by value in an inner join, then left join those results to a SELECT?

好的,所以这是我的基本问题。

我正在组建一个站点,用户可以在其中设置eBay搜索,该搜索将在一整天内在后台自动执行。 在我的数据库中,有以下3个表:

我在哪里存储有关用户希望我执行的搜索的信息。

LISTINGS,即特定于该用户搜索的结果。 基本上,每一行都是我找到的eBay物品的ID,以及“新列表”的标志,或者是用户隐藏的该列表。

ITEM包含有关eBay商品的所有信息(其价格,商品编号,标题,如果仍处于活动状态等),由于多个不同的搜索都可以返回同一eBay商品,因此该信息可以绑定到多个清单。

我想要的是能够执行一个数据库查询,让我获取一个用户ID并选择该用户的所有搜索,然后为每个搜索包括列表总数(减去他们隐藏的所有列表),总数新列表的数量,以及与每个搜索相关的有效eBay项目总数(确保排除所有缺少其详细信息的列表)。

选择搜索很简单,只需一个简单的步骤:

SELECT s.* FROM searches s WHERE s.user = ?    

可以使用以下选择来获取特定搜索的总列表,新列表和活动列表的计数:

SELECT
    ifnull( SUM( l.new = 1 ), 0 ) AS new_listings, 
    ifnull( SUM( i.active = 1 ), 0 ) AS active_items, 
    COUNT( * ) AS count 
FROM listings l JOIN items i 
    ON l.item = i.item 
    WHERE l.search = ? AND l.hidden = 0

但是对于我来说,我似乎无法弄清楚如何将这两个合并为一个查询,其中每行都是搜索的*,其中new_listings,active_items和count列留在其中,而l .search列与s.id列匹配。

我可以只用联接来做到这一点吗? 我需要使用子查询吗? 这只是我的脑海。

谢谢!


根据以下内容对John Ruddell的评论进行编辑:

抱歉,对于未在表之间建立明确的连接感到抱歉。

SEARCHES表具有一个唯一的ID列,用于将其与其列表进行匹配(以及search_keywords,max_price等列)。

这是LISTINGS中的示例行:

search | item          | user | added                | new | hidden
-------------------------------------------------------------------
50     | 140696732281  | 2    | 2017-04-07 19:50:01  | 1   | 0

如果listings.search列与search.id列匹配。

这是ITEMS中的示例行:

item         | title            | img                | price | url               | seller | shipping | active
----------------------------------------------------------------------------------------------------------------
232053821248 | TAIGA SIGNED...  | http://img.ebay... |69.99  | http://www.eba... | ulbop  | 4        | 1

如果listings.item列与items.item列匹配

因此,查询基本上会通过匹配的search.user找到提供的用户ID的所有搜索,然后通过将search.id匹配到listings.search将所有列表匹配到搜索,最后将所有项目都匹配到列表通过将listings.item与items.item列进行匹配来创建表格。

主要思想是使用别名。

我猜这将工作:

SELECT * FROM
(SELECT *.s FROM searches s WHERE s.user = ?) as foo LEFT JOIN (SELECT
ifnull( SUM( l.new = 1 ), 0 ) AS new_listings, 
ifnull( SUM( i.active = 1 ), 0 ) AS active_items, 
COUNT( * ) AS count 
FROM listings l JOIN items i 
ON l.item = i.item 
WHERE l.search = ? AND l.hidden = 0) as foo1

无论您的加入条件如何,都可以左加入。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM