0

次の 2 つのクエリがあり、それらを store_id で結合して、特定の郵便番号ゾーンでデル製品を販売している店舗の数、店舗が開いているかどうか、この店舗のレビューの総数、平均評価を取得したいと考えています。レビュー

SELECT s.* , sh . * , d . * , pd . *, 
CASE
  When (holiday = "Y") THEN "Holiday"
END AS open_status
FROM delivery d, products_description pd, store s, store_hours sh 
WHERE d.deliver_to_postcode =5140 
AND d.store_id = pd.store_id 
AND (pd.products_name like '%dell%' or pd.products_description like '%dell%') 
AND pd.store_id = s.store_id 
AND s.store_id = sh.store_id 
AND sh.weekday = dayname( curdate( ) ) 
GROUP BY  d.store_id'


'SELECT store_id, count( * ) AS  reviews, avg( reviews_rating ) AS  rating 
FROM reviews
WHERE  reviews_status =1'


Total stores  | store_id  | store_name  | Postcode | reviews | rating      | open_status
----------------------------------------------------------------------------------------------------------------------
2             |   1       | store 1     | 5140     |   3     |   2 star    | Holiday
2             |   2       | store 2     | 5140     |   1     |   2 star    | Holiday

これら 2 つのクエリを結合して上記の結果を得るにはどうすればよいですか?

DBテーブルを追加しました

Delivery

Store_id |   postcode
--------------------------
1        |  5140
1        |  5200
2        |  5140


Product description

Store_id | product_name
------------------------
1        | pc dell
1        | pc ibm
2        | screen dell


Store

Store_id | Name
-------------------
1        | Store 1
2        | Store 2


Store hours

Store_id | Holiday
-------------------
1        | N
2        | N


Reviews

Store_id | Product  | Review    | review rating
------------------------------------------------
1        | 1        | review 1  |   3 star
1        | 1        | review 2  |   3 star
1        | 2        | review 1  |   3 star
2        | 1        | review 1  |   2 star

DB SQLを追加しました

--

-- テーブルのテーブル構造delivery

  CREATE TABLE IF NOT EXISTS `delivery` (
   `store_id` int(11) NOT NULL DEFAULT '1',
   `deliver_to_postcode` int(11) NOT NULL,
   PRIMARY KEY (`store_id`,`deliver_to_postcode`)
   ) ENGINE=MyISAM DEFAULT CHARSET=utf8;

--

-- テーブルのテーブル構造products_description

CREATE TABLE IF NOT EXISTS `products_description` (
    `store_id` int(11) NOT NULL DEFAULT '1',
    `products_id` int(11) NOT NULL AUTO_INCREMENT,
    `language_id` int(11) NOT NULL DEFAULT '1',
    `products_name` varchar(255) NOT NULL DEFAULT '',
    `products_short_description` text,
    `products_description` text,
    `products_keyword` varchar(64) DEFAULT NULL,
    `products_tags` varchar(255) DEFAULT NULL,
    `products_url` varchar(255) DEFAULT NULL,
    `products_friendly_url` varchar(255) DEFAULT NULL,
    `products_page_title` varchar(255) NOT NULL,
    `products_meta_keywords` varchar(255) NOT NULL,
    `products_meta_description` varchar(255) NOT NULL,
    `products_viewed` int(5) DEFAULT '0',
     PRIMARY KEY (`store_id`,`products_id`,`language_id`),
     KEY `products_name` (`products_name`),
     KEY `products_description_keyword` (`products_keyword`)
  ) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=20 ;

--

-- テーブルのテーブル構造store

CREATE TABLE IF NOT EXISTS `store` (
   `store_id` int(11) NOT NULL AUTO_INCREMENT,
   `customer_id` int(11) NOT NULL DEFAULT '1',
   `store_name` varchar(64) NOT NULL,
   PRIMARY KEY (`store_id`),
   KEY `customer_id` (`customer_id`)
 ) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;

--

-- テーブルのテーブル構造store_hours

CREATE TABLE IF NOT EXISTS `store_hours` (
    `store_id` int(11) NOT NULL,
    `weekday` varchar(10) NOT NULL,
    `holiday` char(1) NOT NULL DEFAULT 'N',
    KEY `store_id` (`store_id`)
 ) ENGINE=MyISAM DEFAULT CHARSET=utf8;

--

-- テーブルのテーブル構造reviews

 CREATE TABLE IF NOT EXISTS `reviews` (
    `store_id` int(11) NOT NULL DEFAULT '1',
    `reviews_id` int(11) NOT NULL AUTO_INCREMENT,
    `products_id` int(11) NOT NULL,
    `customers_id` int(11) DEFAULT NULL,
    `reviews_rating` int(1) DEFAULT NULL,
    `languages_id` int(11) NOT NULL,
    `reviews_text` text NOT NULL,
    `date_added` datetime DEFAULT NULL,
    `last_modified` datetime DEFAULT NULL,
    `reviews_read` int(5) NOT NULL DEFAULT '0',
    `reviews_status` tinyint(1) NOT NULL,
     PRIMARY KEY (`store_id`,`reviews_id`)
  ) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
4

3 に答える 3

0

これを試して

SELECT
    count(s.store_id) count,
    s.*,
    sh.*,
    ( SELECT count(*)
      FROM reviews r
      WHERE r.reviews_status = 1 AND r.store_id = s.store_dd ) reviews
FROM store s
JOIN delivery d ON s.store_id = d.store_id
JOIN products_description pd ON pd.store_id = d.store_id
JOIN store_hours sh ON sh.store_id = d.store_id
WHERE
    d.deliver_to_postcode = 5140 AND
    sh.weekday = dayname(curdate()) AND
    (pd.products_name LIKE '%dell%' OR pd.products_description LIKE '%dell%')
GROUP BY s.store_id

DBモデル/構造がないため、これ以上のことはできません

于 2013-10-15T10:48:51.080 に答える
0

質問の一部に答えるために - これは、2 つのクエリを結合するために従う構文の形式です - [[クエリ プレース ホルダー]]に SQL ステートメントを入力します。

SELECT  *
FROM (
  [[query1]]
  ) AS q1
JOIN (
   [[query2]]
  ) AS q2
  ON q1.store_id = q2.store_id

注: 私がアスタリスクを使用したのはデモンストレーションのためでした。それを本番環境に導入しないでください。また、最初のクエリで GROUP BY を使用する理由がわかりません。集計関数はありません。

于 2013-10-15T11:05:30.143 に答える
0

ここで解決策を見ることができます: http://sqlfiddle.com/#!2/691a1/8

このソリューションにはいくつかの注意事項があります。

  • 上記のクエリは「間違っている」と思います。最初のクエリには、GROUP BY集約関数ではなく があります。2 番目のクエリには集計関数がありますが、行はありませんGROUP BYGROUP BYこの句を 2 番目のクエリに移動しました。
  • アスタリスクの使用はやり過ぎです。SQLFiddle は、重複する列を一覧表示しません。したがって、store_id は 1 回だけリストされます。
  • 最初のクエリを暗黙的 (theta スタイル) 結合から明示的 (ANSI スタイル) 結合に変更しました。

ここにクエリがあります

SELECT tmp.*, s.* , sh.* , d.* , pd.*, 
  CASE
    When (holiday = "Y") THEN "Holiday"
  END AS open_status
FROM delivery d
JOIN  products_description pd
  ON d.store_id = pd.store_id
JOIN store s
  ON pd.store_id = s.store_id
JOIN store_hours sh 
  ON s.store_id = sh.store_id
JOIN (
    SELECT store_id, count(*) AS  reviews, avg(reviews_rating) AS  rating 
    FROM reviews
    WHERE  reviews_status =1
    GROUP BY store_id) AS tmp
  ON tmp.store_id = s.store_id
WHERE d.deliver_to_postcode =5140 
  AND (pd.products_name like '%dell%' or pd.products_description like '%dell%') 
  AND sh.weekday = dayname( curdate( ) ) 
于 2013-10-18T11:15:41.867 に答える