SQL Query Penner

Hi,

ich benötige eine SQL-Query, die mir alle Artikel ausgibt, die in einem bestimmten Zeitraum nicht verkauft wurden.

Verzweifeln tu ich an der Anforderung, dass ein Artikel als verkauft gilt, wenn IRGENDEINE Variante dieses Artikels verkauft wurde (so wie bei der entsprechenden Auswertung im Backend eben über alle Verkäufe eines Hauptartikels summiert wird).

Im Repository.php steht für diese Abfrage

 Returns a query which selects the sell count of each product.
     * @param \DateTime $from
     * @param \DateTime $to
     * @return DBALQueryBuilder
     */
    protected function createProductSalesBuilder(\DateTime $from = null, \DateTime $to = null)
    {
        $builder = $builder = $this->connection->createQueryBuilder();
        $builder->select(array(
            ‘SUM(details.quantity) AS sales’,
            ‘articles.name’,
            ‘details.articleordernumber as ordernumber’
        ))
            ->from(‘s_order_details’, ‘details’)
            ->innerJoin(‘details’, ‘s_articles’, ‘articles’, ‘articles.id = details.articleID’)
            ->innerJoin(‘details’, ‘s_order’, ‘orders’, ‘orders.id = details.orderID’)
            ->andWhere(‘orders.status NOT IN (-1, 4)’)
            ->groupBy(‘articles.id’)
            ->orderBy(‘sales’, ‘DESC’);

        $this->addDateRangeCondition($builder, $from, $to, ‘orders.ordertime’);

        return $builder;
    }

Es würde ja schon reichen, wenn in obiger Query auch Datensätze mit 0 Verkäufen MIT ausgegeben werden.

Allerdings weiß ich grad auch nicht, wie man diesen Quellcode da oben in eine MySQL-Query umwandelt.

Hat da jemand einen Ansatz für mich?

 

Gruß

Euromann

 

Dieser „Quellcode“ ist ein Query Builder. Es vereinfacht Abfragen, interessant auch bei der Ausführzeit. Du musst diese allerdings nicht nutzen. Du kannst einfaches SQL nutzen.

schon klar, hab jetzt auch die Query bauen können, die da zusammengebaut wird

 

    Select articles.name, articles.id, details.articleordernumber as ordernumber
    FROM s_order_details details
    inner JOIN s_articles as articles on details.articleID = articles.id
    inner join s_order as orders on orders.id = details.orderID
    where orders.status NOT IN (-1, 4)
    and orders.ordertime > „2014-01-01 00:00:00“
    group by articles.id

die muss ich jetzt so umbauen, dass mir auch nicht verkaufte Artikel angezeigt werden, mit Right Joins bzw. Left Joins

ich glaub ich hab’s

 

SELECT ad1.ordernumber
FROM s_articles_details ad1
join s_articles a on a.id = ad1.articleID
left join s_order_details as od on od.articleID=a.id
where od.articleordernumber is NULL
group by a.id

jetzt noch den Datumsbereich reinpfriemeln…

Ok, das mit dem Datumsbereich ist nicht so einfach, weil das Datum in der s_order steht.

 

hat jemand einen Tipp?

Hier mein Ansatz:

SELECT sad.ordernumber
FROM s_articles_details sad
LEFT JOIN (
    SELECT sod.articleID 
    FROM s_order_details sod
    INNER JOIN s_order so ON sod.orderID = so.id
    WHERE so.ordertime >= ‘0’
    GROUP BY sod.articleID
) as tmp ON tmp.articleID = sad.articleID
WHERE tmp.articleID IS NULL
GROUP BY sad.articleID

1 Like