标签: subquery

Laravel:如何在laravel查询构建器中使用派生表/子查询

编辑:

虽然这个问题最初是针对我在下面描述的查询所特有的,但我得到的答案几乎适用于与在Laravel中使用派生表/子查询相关的几乎所有问题.

原始问题:

最近我有点卡在laravel查询构建器上.它有一些非常好的功能,但我觉得它不是为更复杂的数据库操作而构建的.

这是我正在尝试构建的查询:

select 

'IFNULL(counted.product_count, 0) AS product_count', 
'uncounted.value', 
'uncounted.attribute_id', 
'uncounted.attribute_option_id' 

    from ( 

        select
        'counted.id', 
        'counted.attribute_id', 
        'counted.value', 
        'count(counted.attribute_id) AS product_count'

        from `attribute_options` as `counted` 
        where `counted.product_id` in (?, ?, ?, ?, ?) 
        group by `counted.attribute_option_id` 

    ) as 'counted' 

right join 'attribute_options' as 'uncounted'
        on 'counted.id' = 'uncounted.id' 

  group by 'attribute_option_id'
Run Code Online (Sandbox Code Playgroud)

查询说明: 我正在laravel中为我的产品目录构建一个分面搜索.根据用户提供的过滤器/属性缩小产品范围.为了获得更好的用户体验,我想显示每个过滤器剩余的产品数量,这就是上面的查询所做的事情:计算某个属性的所有产品,其中product_id是产品ID的数组.

我的尝试:

    $productIds = [ 1, 2, 3, 4, 5 ];

    $subQuery = \DB::table('attribute_options')->selectRaw('counted.id, counted.attribute_id, counted.value, count(counted.attribute_id) AS product_count')
                    ->from('attribute_options AS counted')
                    ->whereIn('counted.product_id', $productIds)
                    ->groupBy('counted.attribute_option_id')
                    ->mergeBindings($subQuery);

    $query …
Run Code Online (Sandbox Code Playgroud)

php subquery query-builder laravel

12
推荐指数
1
解决办法
1万
查看次数

SQL:"NOT IN"替代选择基于*不同*行的值的行?

如何创建一个返回由子查询修改的结果的SQL语句,或者一个处理您尝试返回的信息的连接或其他内容?

例如:

CREATE TABLE bowlers (
bowling_id int4 not null primary key auto_increment,
name text,
team text
);
Run Code Online (Sandbox Code Playgroud)

有人可能错误地在多个团队中:

INSERT INTO `bowlers` (`name`, `team`) VALUES
('homer', 'pin pals'),
('moe', 'pin pals'),
('carl', 'pin pals'),
('lenny', 'pin pals'),
('homer', 'The homer team'),
('bart', 'The homer team'),
('maggie', 'The homer team'),
('lisa', 'The homer team'),
('marge', 'The homer team'),
('that weird french guy', 'The homer team');
Run Code Online (Sandbox Code Playgroud)

所以homer不能决定他的球队,所以他两个都在.Do'h!

我想知道所有在场的人,the homer team谁也不在pin pals团队中.我能做的最好的就是:

SELECT a.name, a.team 
    FROM bowlers …
Run Code Online (Sandbox Code Playgroud)

mysql performance subquery

11
推荐指数
1
解决办法
1万
查看次数

为什么不在子查询中出现"无效列名XYZ"错误; 虽然列名不在子查询表中?

当我运行此查询时

SELECT CustomerId FROM Stocks.dbo.Suppliers
Run Code Online (Sandbox Code Playgroud)

它给了我这个错误.列名称'CustomerId'无效.此错误有效,因为Suppliers表中没有列CustomerId; 但是当我在子查询中使用相同的查询时,它不会给出任何错误.例如

SELECT * 
  FROM SomeOtherDb.dbo.Customer 
 WHERE CustomerId In( SELECT CustomerId 
                        FROM Stocks.dbo.Suppliers)
Run Code Online (Sandbox Code Playgroud)

在这里,我期待相同的错误"无效的列名称",但查询运行没有任何错误.

完全限定名称只是惯例,两个dbs都在同一台服务器上.

CustomerId确实存在于SomeOtherDb.dbo.Customer表中,但不存在于子查询中.

为什么会这样?这是子查询的东西吗?

谢谢.

sql t-sql sql-server sql-server-2005 subquery

11
推荐指数
1
解决办法
3636
查看次数

JPQL/QueryDSL:加入子查询并获取别名列

我试图通过加入子查询来获得对groupBy的计数的平均值.不知道这是否是正确的方法,但除了mysema doc之外我无法解决任何关于子查询的问题.

场景:客户平均每件产品订单数量是多少?含义:客户订购产品.因此,客户多次(计数)订购了特定产品.客户为任何产品订购的平均订单数量是多少?

可能听起来有点假设,事实上它只是原型的一部分,但它让我想知道如何使用来自Mysema的花哨的QueryDSL来获取在子查询中创建的自定义列的引用.

在SQL中,您只需为count列指定一个别名,并使用第二个ID列进行连接.QueryDSL也有"as()"方法,但我不知道,如何检索该列加上我看不出它如何与其他人加入一个查询,因为query.list()只是获取一个列表但是对于某些加入接受它的原因.感觉不对...

这是我的代码:

    JPQLQuery query = createJPQLQuery();

    QOrdering qOrdering = QOrdering.ordering;
    QProduct qProduct = QProduct.product;
    QCustomer qCustomer = QCustomer.customer;           

    // how many of each product did a customer order?
    HibernateSubQuery subQuery = new HibernateSubQuery();
    subQuery.from(qOrdering).innerJoin(qOrdering.product,qProduct).innerJoin(qOrdering.customer, qCustomer);
    subQuery.groupBy(qCustomer,qProduct).list(qCustomer.id,qProduct.id,qProduct.count());

    // get the average number of orders per product for each customer
    query.from(qCustomer);      
    query.innerJoin(subQuery.list(qCustomer.id,qOrdering.count().as("count_orders")));      
    query.groupBy(qCustomer.id);
    return (List<Object[]>) query.list(qCustomer.firstname,subQuery.count_orders.avg());
Run Code Online (Sandbox Code Playgroud)

再说一次:我如何加入子查询?如何获得别名"count"列以进行更多聚合,例如avg(我的团队是正确的btw?)可能是因为我有其他一些错误,所以任何帮助表示赞赏!

谢谢!

编辑: 这是我希望看到QueryDSL产生的本机SQL:

Select avg(numOrders) as average, cust.lastname from
customer cust
inner join
(select count(o.product_id) as numOrders, c.id as cid, p.name …
Run Code Online (Sandbox Code Playgroud)

subquery jpql querydsl

11
推荐指数
1
解决办法
2万
查看次数

根据ScalaQuery/SLICK中列的MAX值选择行

说我有这样的表:

UserActions
    UserId INT
    ActionDate TIMESTAMP
    Description TEXT
Run Code Online (Sandbox Code Playgroud)

包含用户执行某些行为的日期.如果我想获得每个用户执行的最后一个操作,我将不得不在SQL中执行以下操作:

SELECT *
FROM   UserActions,
       (
           SELECT ua.UserId,
                  max(ua.ActionDate) AS lastActionDate
           FROM   UserActions ua
           GROUP BY ua.UserId
       ) AS lastActionDateWithUserId
WHERE  UserActions.UserId = lastActionDateWithUserId.UserId 
  AND  UserActions.ActionDate = lastActionDateWithUserId.lastActionDate
Run Code Online (Sandbox Code Playgroud)

现在,假设我已经在scalaquery 0.9.5中为UserActions设置了表结构,例如:

case class UserAction(userId:Int,actionDate:Timestamp,description:String)

object UserActions extends BasicTable[UserAction]("UserActions"){

    def userId = column[Int]("UserId")

    def actionDate = column[Timestamp]("ActionDate")

    def description  = column[String]("Description")

    def * = userId ~ actionDate ~ description <> (UserAction, UserAction.unapply _)
}
Run Code Online (Sandbox Code Playgroud)

我的问题是:在ScalaQuery/SLICK中我该如何执行这样的查询?

scala subquery max scalaquery slick

11
推荐指数
1
解决办法
3853
查看次数

SQL - 聚合函数中的子查询

我正在使用northwind数据库通过创建一些或多或少复杂的查询来刷新我的SQL技能.不幸的是,我无法找到我最后一个用例的解决方案:"获取1997年每个类别的五个最大订单的总和."

涉及的表格是:

Orders(OrderId, OrderDate)
Order Details(OrderId, ProductId, Quantity, UnitPrice)
Products(ProductId, CategoryId)
Categories(CategoryId, CategoryName)
Run Code Online (Sandbox Code Playgroud)

我尝试了以下查询

SELECT c.CategoryName, SUM(
  (SELECT TOP 5 od2.UnitPrice*od2.Quantity 
   FROM [Order Details] od2, Products p2
   WHERE od2.ProductID = p2.ProductID
   AND c.CategoryID = p2.CategoryID
   ORDER BY 1 DESC))
FROM [Order Details] od, Products p, Categories c, Orders o 
WHERE od.ProductID = p. ProductID
AND p.CategoryID = c.CategoryID
AND od.OrderID = o.OrderID
AND YEAR(o.OrderDate) = 1997
GROUP BY c.CategoryName
Run Code Online (Sandbox Code Playgroud)

嗯......事实证明,在聚合函数中不允许使用子查询.我已经阅读了有关此问题的其他帖子,但无法找到针对我的具体用例的解决方案.希望你能帮帮我...

sql subquery aggregate-functions northwind sql-server-2012

11
推荐指数
1
解决办法
7万
查看次数

"in subselect"的休眠标准

我正在尝试这样做,但使用Criteria而不是HQL:

select user from User where user in (
    select user from UserDomain where domain.id = "XXX"
)
Run Code Online (Sandbox Code Playgroud)

用户是与one-to-many联接表UserDomain 有关系的实体.这里的要点只是找到链接到Domainid ="XXX"的用户.

这看起来应该很简单......但到目前为止,我没有运气任何有用的文档.

nhibernate hibernate criteria subquery

11
推荐指数
2
解决办法
3万
查看次数

Rails Activerecord Relation:使用子查询作为SQL select语句的表

有人可以帮我弄清楚如何使用Rails编写以下SQL(我使用的是Rails 4)Activerecord方法?我知道你可以用find_by_sql做到这一点,但我想保留活动的记录关系.这是我正在尝试创建的postGreSQL数据库的sql:

SELECT * FROM 
(SELECT DISTINCT ON(table_a.id) table_a.name as alias_a, table_b.id, table_b.time
FROM table_1
LEFT OUTER JOIN table_b ON table_a.id = table_b.id
ORDER BY table_a.id, table_b.time asc) AS subquery
ORDER BY alias_a asc
Run Code Online (Sandbox Code Playgroud)

对于我的子查询,我有以下内容(它生成上面子查询的sql):

@subquery = table_a.select("DISTINCT ON(table_a.id) table_a.name as alias_a, table_b.time")     
@subquery = @subquery.joins("LEFT OUTER JOIN table_b ON table_a.id = table_b.id")
@subquery = @subquery.order("table_a.id, table_b.time asc")
Run Code Online (Sandbox Code Playgroud)

但是,我无法弄清楚如何编写一个使用@subquery作为外部select语句的表的select语句.

sql postgresql ruby-on-rails subquery ruby-on-rails-4

11
推荐指数
1
解决办法
1万
查看次数

内部使用子查询连接派生表

环境:SQL 2008 R2

我使用子查询创建了一个派生表,并与主表连接.我只想知道子查询是仅执行一次还是将对结果集中的每一行执行.请考虑以下示例(虚构表名仅供参考)

SELECT E.EID,DT.Salary FROM Employees E
INNER JOIN
(
    SELECT EID, (SR.Rate * AD.DaysAttended) Salary
    FROM SalaryRate SR
    INNER JOIN AttendanceDetails AD on AD.EID=SR.EID
) DT --Derived Table for inner join
ON DT.EID=E.EID
Run Code Online (Sandbox Code Playgroud)

那么,用于Inner Join的子查询只会被执行一次或多次?

如果我使用OUTER APPLY重写上面的查询,我肯定知道将为每一行执行子查询.见下文.

SELECT E.EID,DT.Salary FROM Employees E
OUTER APPLY
(
    SELECT (SR.Rate * AD.DaysAttended) Salary
    FROM SalaryRate SR
    INNER JOIN AttendanceDetails AD on AD.EID=SR.EID
    WHERE SR.EID=E.EID
) DT --Derived Table for outer apply
Run Code Online (Sandbox Code Playgroud)

所以只想确保Inner Join只执行一次子查询.

sql-server join subquery sql-server-2008

11
推荐指数
1
解决办法
7万
查看次数

你能索引子查询吗?

我有一个表和一个如下所示的查询.有关工作示例,请参阅此SQL小提琴.

SELECT o.property_B, SUM(o.score1), w.score
FROM o
INNER JOIN 
(
    SELECT o.property_B, SUM(o.score2) AS score FROM o GROUP BY property_B
) w ON w.property_B = o.property_B
WHERE o.property_A = 'specific_A'
GROUP BY property_B;
Run Code Online (Sandbox Code Playgroud)

使用我的真实数据,此查询需要27秒.但是,如果我首先创建w作为临时表和索引property_B,它们总共需要约1秒.

CREATE TEMPORARY TABLE w AS
SELECT o.property_B, SUM(o.score2) AS score FROM o GROUP BY property_B;

ALTER TABLE w ADD INDEX `property_B_idx` (property_B);

SELECT o.property_B, SUM(o.score1), w.score
FROM o
INNER JOIN w ON w.property_B = o.property_B
WHERE o.property_A = 'specific_A'
GROUP BY property_B;

DROP TABLE …
Run Code Online (Sandbox Code Playgroud)

mysql indexing subquery

11
推荐指数
1
解决办法
1万
查看次数