2

次のようなテーブルがあるとします。

**tablename**
ID     Name      Size      Date   AtStore1  AtStore2
 1    Apple    Medium  20120101                  Yes
 2     Pear    Medium  20111231        Yes       Yes
 3    Lemon     Small  20111231        Yes       Yes
 4   Orange     Small  20111231        Yes          
 5   Carrot    Medium  20111231        Yes          
 6   Potato     Small  20111231        Yes          
 7   Celery     Large  20111231                  Yes
 8    Onion    Medium  20111231                     
 9   Tomato    Medium  20111231                     
 10   Apple    Medium  20111231                     
 12    Pear    Medium  20111230        Yes       Yes
 13   Lemon     Small  20111230        Yes       
 14  Orange     Small  20111230                  Yes
 15  Carrot    Medium  20111230                  Yes
 16  Potato     Small  20111230           
 17  Celery     Large  20111229                     
 18   Onion    Medium  20111229                  Yes
 19  Tomato    Medium  20111229                     

行ごとにすべてのデータを取得する効率的なクエリを構築できますか?

  • その日の AtStore1 に少なくとも 4 つの「はい」がある「はい」の AtStore1 行 1 日
    OR (包括的)
  • AtStore2 に「はい」があります

行の前方参照など、最初のパラメータのみが満たされている場合も許容されます。必要に応じて、AtStore2 部分を PHP でスクリプト化できます。私の試みはすべて惨めに失敗しました。Google で効果的に質問を書く方法についての私の試みも実りがありませんでした。

(PHPでコードのさまざまな部分に物事を分割する回答も問題ありません。合理的に効率的なものが欲しいだけです。)

この例のテーブルでは、次の行が予想されます。

ID     Name      Size      Date   AtStore1  AtStore2
 1    Apple    Medium  20120101                  Yes
 2     Pear    Medium  20111231        Yes       Yes
 3    Lemon     Small  20111231        Yes       Yes
 4   Orange     Small  20111231        Yes          
 5   Carrot    Medium  20111231        Yes          
 6   Potato     Small  20111231        Yes          
 7   Celery     Large  20111231                  Yes
12     Pear    Medium  20111230        Yes       Yes
14   Orange     Small  20111230                  Yes
15   Carrot    Medium  20111230                  Yes
18    Onion    Medium  20111229                  Yes

ご覧のように

  • 2012 年 1 月 1 日
    - いいえ AtStore1 ではい -
    AtStore2 にははいがあるため、行が返されます
  • 12 月 31 日
    -5 AtStore1 が Yes であるため、それらが返されます (AtStore2 が ID 2 および 3 で Yes であっても十分でした)
    - AtStore2 が Yes であるため、ID 7 も持ちます
  • 返された残りの行は、AtStore2 の Yeses が原因でした。
4

2 に答える 2

1

これを試して:

select t.* 
from tablename t
join (
    select date
    from tablename
    where AtStore1='yes'
    group by date
    having count(*) >= 4
) ta on t.date = ta.date and t.AtStore1 = 'yes'
union
select *
from tablename
where AtStore2 = 'yes'

結果:

ID  Name    Size    Date    AtStore1    AtStore2
1   Apple   Medium  2012-01-01 00:00:00.000 NULL    Yes
2   Pear    Medium  2011-12-31 00:00:00.000 Yes Yes
3   Lemon   Small   2011-12-31 00:00:00.000 Yes Yes
4   Orange  Small   2011-12-31 00:00:00.000 Yes NULL
5   Carrot  Medium  2011-12-31 00:00:00.000 Yes NULL
6   Potato  Small   2011-12-31 00:00:00.000 Yes NULL
7   Celery  Large   2011-12-31 00:00:00.000 NULL    Yes
12  Pear    Medium  2011-12-30 00:00:00.000 Yes Yes
14  Orange  Small   2011-12-30 00:00:00.000 NULL    Yes
15  Carrot  Medium  2011-12-30 00:00:00.000 NULL    Yes
18  Onion   Medium  2011-12-29 00:00:00.000 NULL    Yes

この場合、null 値は集計によって意図的に削除されます。

AtStore1列に値があるかどうかを気にせずに特定の日のすべての行が必要な場合、それを削除するかどうかand t.AtStore1 = 'yes'はわかりません。ta on t.date = ta.date and t.AtStore1 = 'yes'yes

追加

コメントからの質問への回答ですが、これは迅速でおそらく汚い方法です(時間がない):

select t3.*, t4.qty from tablename t3
join (
    select id, max(qty) as qty from (
        select t.id, ta.qty
        from tablename t
        join (
            select date, count(*) as qty
            from tablename
            where AtStore1='yes'
            group by date
            having count(*) >= 4
        ) ta on t.date = ta.date and t.AtStore1 = 'yes'
        union
        select id, 0 as src
        from tablename
        where AtStore2 = 'yes'
    ) t2
    group by t2.id
) t4 on t3.id = t4.id

結果:

ID  Name    Size    Date    AtStore1    AtStore2    qty
1   Apple   Medium  2012-01-01 00:00:00.000 NULL    Yes 0
2   Pear    Medium  2011-12-31 00:00:00.000 Yes Yes 5
3   Lemon   Small   2011-12-31 00:00:00.000 Yes Yes 5
4   Orange  Small   2011-12-31 00:00:00.000 Yes NULL    5
5   Carrot  Medium  2011-12-31 00:00:00.000 Yes NULL    5
6   Potato  Small   2011-12-31 00:00:00.000 Yes NULL    5
7   Celery  Large   2011-12-31 00:00:00.000 NULL    Yes 0
12  Pear    Medium  2011-12-30 00:00:00.000 Yes Yes 0
14  Orange  Small   2011-12-30 00:00:00.000 NULL    Yes 0
15  Carrot  Medium  2011-12-30 00:00:00.000 NULL    Yes 0
18  Onion   Medium  2011-12-29 00:00:00.000 NULL    Yes 0
于 2012-01-02T08:08:11.657 に答える
0

次のようになります。

SELECT * FROM t1 WHERE ID IN (
    SELECT Id FROM t1 WHERE AtStore2 != 'Yes' AND Date IN (
        SELECT Date FROM t1 WHERE AtStore1 = 'Yes' GROUP BY Date
        HAVING COUNT(Date) >= 4
))
UNION ALL
SELECT * FROM t1 WHERE AtStore2 = 'Yes'

"ID";"名前";"サイズ";"日付";"Atstore1";"Atstore2" "1";"Apple";"中";"20120101";"";"はい" "2";"梨";"中";"20111231";"はい";"はい" "3";"レモン";"小";"20111231";"はい";"はい" "4";"オレンジ";"小";"20111231";"はい";"" "5";"にんじん";"中";"20111231";"はい";"" "6";"じゃがいも";"小";"20111231" ;"はい";"" "7";"セロリ";"大";"20111231";"";"はい" "8";"タマネギ";"Medium";"20111231";"";"" "9";"トマト";"Medium";"20111231";"";"" "10";"Apple";"Medium";"20111231";" ";"" "12";"梨";"中";"20111230";"はい";"はい" "14";"オレンジ";"小";"20111230";"";"はい"" 15";"ニンジン";"ミディアム";"20111230";"";"はい" "18";"タマネギ";"ミディアム";"20111229";"";"はい""中";"20111231";"";"" "12";"ナシ";"中";"20111230";"はい";"はい" "14";"オレンジ";"小";"20111230 ";"";"はい" "15";"ニンジン";"ミディアム";"20111230";"";"はい" "18";"タマネギ";"ミディアム";"20111229";"";"はい""中";"20111231";"";"" "12";"ナシ";"中";"20111230";"はい";"はい" "14";"オレンジ";"小";"20111230 ";"";"はい" "15";"ニンジン";"ミディアム";"20111230";"";"はい" "18";"タマネギ";"ミディアム";"20111229";"";"はい"18";"タマネギ";"ミディアム";"20111229";"";"はい"18";"タマネギ";"ミディアム";"20111229";"";"はい"

于 2012-01-02T08:11:47.500 に答える