1

WordPressデータベースでシリアル化された投稿メタ値を検索しようとしています。シリアル文字列の構造を知っているので、前の値を検索し、インデックスを取得してから、そのインデックス値の前に必要な文字数を取得できます。結果に基づいてソートしたいので、この特定のクエリで正規表現を効果的に使用することはできません。これは私がこれまでに持っているものですが、構文に失敗しており、ASキーワードの使用とANDステートメントのグループ化に関係していると思います。

    SELECT SQL_CALC_FOUND_ROWS _posts.ID FROM _posts
    INNER JOIN _postmeta ON(_posts.ID = _postmeta.post_id)
    WHERE 1 = 1
    AND _posts.post_type='犬'
    AND(_posts.post_status ='publish')
    AND((_postmeta.meta_key ='_meta_general'
       AND CAST(_postmeta.meta_value AS CHAR))AS dmet
       AND POSITION('; s:6:\ "weight' IN dmet)AS ddex
       AND MID(dmet、ddex、10))AS dres
    GROUP BY dres ORDER BY dres ASC LIMIT 0、10

まあ、私はまだこのことの構造に問題があります。綿密な調査の後、前のコード@fenwayは機能しませんでした。これが私が今持っているものです。@fenwayの回答の問題は、「FROM」投稿を選択していたステートメントの選択部分でMID値とPOSITION値が呼び出されていたことです。それらはpostmetaにあります。そこで、postmetaテーブルをidでpostsテーブルに結合しているINNERJOINの後に文字列フィルタリングを再配置しようとしました。これは機能していません。この質問は単にSQLに関する知識が不足しているためだと理解していますが、ここで学ぼうとしています。

これらのどれも私が望むように機能していません。構文エラーがあります。このコードの目的は、返されたクエリを、serial(json)文字列内の値でグループ化することです。この方法では、次の値を検索します(この場合、次のようになります-"; s:6:" weight-)この文字列のインデックスがある場合、前の10個の値(日付xx / xx /)を返します。 xxxx)。この文字列にラベルを付けて(AS dres)、結果をdresで並べ替えます。Wordpressはpostsテーブルから投稿を収集し、postmetaテーブルからpostmetaを収集します。post metaテーブルは、jsonが格納される場所です。これは本当に単純なアルゴリズムであり、私を悩ませているのは構文だけです。

    SELECT SQL_CALC_FOUND_ROWS {$ wpdb-> posts} .ID
    FROM {$wpdb->posts}内部結合{$wpdb->postmeta}
    MID(CAST({$ wpdb-> postmeta} .meta_value AS CHAR)、
    POSITION('; s:6:\ "weight' IN CAST({$ wpdb-> postmeta} .meta_value AS CHAR))、10)AS dres
    オン({$ wpdb-> posts} .ID = {$ wpdb-> postmeta} .post_id)
    WHERE 1 = 1
    AND {$ wpdb-> posts} .post_type ='dog'
    AND({$ wpdb-> posts} .post_status ='publish')
    AND {$ wpdb-> postmeta} .meta_key ='_meta_general'
    AND POSITION('; s:6: "weight' IN CAST({$ wpdb-> postmeta} .meta_value AS CHAR))> 0
    GROUP BY {$ wpdb-> posts} .ID ORDER BY dres ASC LIMIT 0、10

4

1 に答える 1

1

WHERE句で列エイリアスを使用することはできません。さらに、場合によっては、これらの式は常にTRUEと評価されるため、なぜそこにあるのかわかりません。

おそらくあなたは意味します:

SELECT SQL_CALC_FOUND_ROWS 
_posts.ID
,MID(
   CAST(_postmeta.meta_value AS CHAR),
   POSITION(';s:6:\"weight' IN CAST(_postmeta.meta_value AS CHAR) ),
   10
) AS dres  
FROM _posts 
INNER JOIN _postmeta ON (_posts.ID = _postmeta.post_id)
WHERE 1=1
AND _posts.post_type = 'dog' AND _posts.post_status = 'publish'
AND _postmeta.meta_key = '_meta_general'
AND POSITION(';s:6:\"weight' IN CAST(_postmeta.meta_value AS CHAR)) > 0
GROUP BY dres ORDER BY _postmeta.meta_value ASC LIMIT 0, 10
于 2013-02-24T20:55:24.313 に答える