開発メモ,主に補足by子連れ親父プログラマー

2010-04-17

DISTINCT と ORDER BY を一緒に使う時の、PostgresとMySQLの違い

今やってるやつで、出てきた現象なのでちょっとメモ。
例えば items というようなテーブルがあって、id と name がある。
 id |  name
----+--------
  1 | test
  2 | sample
で、この items には複数のカテゴリーとサブカテゴリーが紐づけられている。
紐づけ用のテーブルは items_categories というようなもので、こんな感じになっている。
 item_id | category_id | sub_category_id | orders
---------+-------------+-----------------+--------
       1 |           1 |               1 |      2
       1 |           1 |               2 |      2
       2 |           1 |               2 |      1
アイテム1はサブカテゴリー1と2に、アイテム2はサブカテゴリー2に紐付いていて、どちらもカテゴリーは1だが、
そのカテゴリー1の中での並ぶ順番が orders ということで設定されている。
アイテム2が順番は1、アイテム1が2番と。

で、こいつをまず順番関係なしに、join してみると
SELECT ic.item_id, i.name 
FROM items_categories ic 
INNER JOIN items i ON ic.item_id=i.id
WHERE ic.category_id=1
こうなる。
 item_id |  name
---------+--------
       1 | test
       1 | test
       2 | sample
orders 順にしたいので、
SELECT ic.item_id, i.name 
FROM items_categories ic 
INNER JOIN items i ON ic.item_id=i.id
WHERE ic.category_id=1
ORDER BY ic.orders
とすると、
 item_id |  name
---------+--------
       2 | sample
       1 | test
       1 | test
これは動く。item_id が重複してるので、distinct を使うと、
SELECT DISTINCT ic.item_id, i.name 
FROM items_categories ic 
INNER JOIN items i ON ic.item_id=i.id
WHERE ic.category_id=1
ORDER BY ic.orders
Postgresの場合、エラーになる。
ERROR:  for SELECT DISTINCT, ORDER BY expressions must appear in select list
MySQLの場合、
 item_id |  name
---------+--------
       2 | sample
       1 | test
出る。
Postgresでも
SELECT DISTINCT ic.item_id, i.name, ic.orders 
FROM items_categories ic 
INNER JOIN items i ON ic.item_id=i.id
WHERE ic.category_id=1
ORDER BY ic.orders
とすればちゃんと出る。
 item_id |  name  | orders
---------+--------+--------
       2 | sample |      1
       1 | test   |      2
そりゃ、おかしいのはMySQLでしょう。この場合。

2010-04-13

デザイナーが作った.htmlファイルを一括して.tplファイルにする

find ./ -name '*.html' | while read line; do
mv $line `echo $line | sed -e 's,\.html$,.tpl,'`
done
いや、理解はできてない。。

2010-04-03

jQueryのWYSIWYGエディターでkeyupとかkeypressのイベントを取り出す

今週ずーっとやってた不毛なjQueryアプリですが、一番はまってたWYSIWYGエディター部分についてまとめておきます。
WYSIWYGエディターというと世間ではFCKeditorが有名ですが、まあ、あれはちょっと重いんじゃない?
ってことで、jQueryのプラグインで探す訳ですが、どーもね、これっていうのがない訳で。

最初に使ってみたのがこれ
LIGHTWEIGHT RICH TEXT EDITOR (RTE / WYSIWYG) PLUGIN FOR JQUERY

使い方はこんな感じ
<textarea name="info1" cols="100" rows="10"  class="rte1"></textarea>

<script type="text/javascript">
$(document).ready(function() {
 $('.rte1').rte({
  css: ['default.css'],
  controls_rte: rte_toolbar,
  controls_html: html_toolbar
 });
});
</script>
jquery.rte.tb.js にツールバーの設定がまとめられてるのでそれを編集する。
firebugで見てるとキーを入力する度に
!keyup イベントでは charCode プロパティの値には意味がないため使用すべきではありません。
の警告が出るのがいまいちです。

次がこれ
JHTMLAREA - WYSIWYG HTML EDITOR FOR JQUERY

使い方はこんな感じ
<script type="text/javascript">
$(function() {
 $("#info").htmlarea({
  toolbar: [
   ["bold", "italic", "underline", "|", "forecolor"],
   ["p", "h1", "h2", "h3", "h4", "h5", "h6"],
   ["link", "unlink", "|", "image"],
   [{
    css: "custom_disk_button",
    text: "Save",
    action: function(btn) {
     alert('SAVE!\n\n' + this.toHtmlString());
    }
   }]
  ],
  loaded: function() {
   //
  }
 });
});
</script>


<textarea id="info" cols="50" rows="15"></textarea>
loaded とかでエディターが起動した後になにか処理を入れられる。
ドキュメントがあまり詳しくなくていまいちですかねー。
Microsoft Public License というあまり聞いたことのない?ライセンスです。

最後にこれ
HTMLBOX

使い方はこんな感じ
<textarea id='hb'></textarea>

<script language="Javascript" type="text/javascript">
var hb = $("#hb").htmlbox({
    buttons:[
      ["separator_dots","bold","italic","underline"]
 ],
 icons:"default",
 skin:"green"
});
</script>
一応PDFのドキュメントがあるんですが、どうも説明が足りなくて使い方が分からない。
UndoRedoManager plugin とか。
おもしろそうなんだけど、さっぱりわからんのだー。

ま。最後のが一番よさそうですけどね。

で、今回の課題はこのエディターで文字を入力してる最中にそのイベントを取りたいってことなんだけども、
そもそもこういうエディターというのはフォームの textarea に設定するけれども、textarea そのものは非表示にして、その近くに iframe をつっこんで
<div>
 <iframe style="height: 305px; width: 415px;">
  <html>
   <head>
   </head>
   <body>
   </body>
  </html>
 </iframe>
</div>
みたいにして。

でhtmlを表示させて機能しているようで、DOMがどうなってるんだかさっぱり分からない。
どういうからくりになってるんだか・・・。

で、結論から言うと、
編集中の文字とかを取り出すには
$('iframe').contents().find('body').html()
keyupのイベントを取り出すには、
$('iframe').contents().keyup(function(){
 // なにか処理
}
でいけます。
試しに文字を入力する度にその中の文字数を表示するというのをやってみると、
<script language="Javascript" src="jquery-1.3.2.min.js" type="text/javascript"></script>
<script language="Javascript" src="htmlbox.min.js" type="text/javascript"></script>
<script language="Javascript" src="formState.js" type="text/javascript"></script>

<textarea id='hb'></textarea>
<script language="Javascript" type="text/javascript">
var hb = $("#hb").htmlbox({
 buttons:[
  ["separator_dots","bold","italic","underline"]
 ],
 icons:"default",
 skin:"green"
});

$(function() {
 $('iframe').contents().keyup(function(){
  $('#count').val($('iframe').contents().find('body').text().length);
 });
});
</script>
<input type="text" id="count" />
こんな感じになります。

このブログを検索

Powered by Blogger.

ラベル

php (17) jQuery (13) OSX (10) MySQL (8) Javascript (7) Postgres (7) port (7) apache (6) Java (3) Smarty (2) html (2) pear (2) FCKEditor (1) XAMPP (1) css (1) git (1) perl (1) ruby (1)

Facebookバナー