• 締切済み

PHP SQL 問合せについて

PHP SQL 問合せについて http://okwave.jp/qa/q7689206.html での質問の続きとなります。 No,name 1,ばなな 2,りんご 3,ばなな 4,みかん 5,ばなな 6,りんご 上記テーブルで 1,ばなな 3,ばなな 5,ばなな 2,りんご 6,りんご 4,みかん の結果を得るSQLはどのように記述すればよいでしょうか? 回答 select * from tableA x order by (select count(*) from tableA y where y.name = x.name ) ,No で解決していますが、 select * from tableA x where name ='果物' とした場合、結果が異なります。 (結果が多い順にならない) 出現回数が多い順に並べるには、どのような記述になりますか? データには「果物以外のデータが含まれている」とします。 宜しくお願い致します。

みんなの回答

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.4

とりあえずちょっと書き方をかえて select *,(select count(*) from tableA y where y.name = x.name) as z from tableA x where kind ='果物' order by z desc,name,No とすれば、きちんと出現頻度でソートされていることがわかると思います。 もしzの値が想定と異なる場合は、なんらかの条件が違うのでしょう そうなると質問者さんの環境がわからないので答えようがありません

koyuhi
質問者

お礼

ありがとうございます。 結果は同じでした。データのチェックを行います。 select * from tableA x order by (select count(*) from tableA y where y.name = x.name),name,No で結論しました。 ありがとうございました。

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.3

>ソートのルールは、最後のNoで良いのではないでしょうか? ん?? nameでソートしないと出現数が同じものが互い違いに表示される可能性が ありますがよろしいのですか? >select * from tableA x whehe kind ='果物' >order by (select count(*) from tableA y >where y.name = x.name and kind ='果物') desc,No >で80%ほどの正しい結果が求められるようになりました。 typoは適宜読みかえるとして、 order byの中であえて果物を指定しなくても結果は変わりません (若干効率がかわるかもしれませんが) select * from tableA x where kind ='果物' order by (select count(*) from tableA y where y.name = x.name) desc,name,No 「80%」というのが微妙ですが、別のテーブルの構造でミスがあるのかも しれないので、こまかくご自身でチェックするしかないでしょう。 今回の例だと上記でとくに問題ないと思います

koyuhi
質問者

補足

ありがとうございます。 >nameでソートしないと出現数が同じものが互い違いに表示される可能性が >ありますがよろしいのですか? name でまとめるで理解できました。 追加で2点お願いします。 1点目 order by (select count(*) ・・・で全レコードの一番多い項目「ばななx3」 を集めてくると思っていますが、間違いでしょうか? 2点目 「りんごx2」 「ばななx3」 「みかんx1」 と結果が返る事があります。 上記SQLで原因が考えられますか? 宜しくお願い致します。

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.2

nameは品物の名前ですよね?name='果物'というのが理にかないませんが・・・ また、出現数が同じ場合のソートルールも定義されていないですね とりあえずこんな感じで create table tableA(no int,name varchar(10),kind varchar(10)); insert into tableA values(,'1,'ばなな','果物'),(,'2,'りんご','果物'),(,'3,'ばなな','果物'),(,'4,'みかん','果物'),(,'5,'ばなな','果物'),(,'6,'りんご','果物'),(,'7,'とまと','野菜'),(,'8,'きゅうり','野菜'),(,'9,'とまと','野菜'),(,'10,'きゅうり','野菜'),(,'11,'きゅうり','野菜'),(,'12,'にんじん','野菜'),(,'13,'にんじん','野菜'); select x.no,x.name,x.kind from tableA as x inner join (select name,count(*) as count from tableA group by name ) as y on x.name=y.name where kind ='果物' order by y.count desc,x.name,x.no

koyuhi
質問者

補足

ありがとうございます。ヒントにつながりました。 kind 追加します。 ソートのルールは、最後のNoで良いのではないでしょうか? 現状では、 select * from tableA x whehe kind ='果物' order by (select count(*) from tableA y where y.name = x.name and kind ='果物') desc,No で80%ほどの正しい結果が求められるようになりました。 なので、正しい記述ではありません。 上記の記述の訂正をお願い致します。

回答No.1

上記例だと、一体「果物」とはどこに出現するのでしょうか? ばなな、りんご、みかん しかありませんが。 また、条件に「果物」のみを処理しようとすれば、当然それしか でなくなるわけですから、結果が多い順どころか「果物」しか でないと思いますけど。 具体的にどういうデータでどういうSQLを走行させるとどういう結果が得られ、 本来はどういう結果であって欲しいのかを総称などを利用せず、データのみで 説明してください。 また、SQLは理解していますか?

koyuhi
質問者

補足

ありがとうございます。 次の方が見る可能性があります。 不明な回答は必要ありません。