0

ポストとポストメタの 2 つのテーブルがあります。

posts
ID   title   category  post_status  post_type    

1    ABC      cat-1    Publish      Store
2    DEF      cat-2    Publish      Store
3    GHI      cat-3    Publish      Store
4    JKL      cat-2    Publish      Store
5    XYZ      cat-5    Draft        Store
6    MNO      cat-9    Publish      Article

postmeta
meta_id post_id  meta_key    meta_value

109       1       city          1
110       1       featured      h
111       2       city          1,2
112       2       featured      both
113       3       city          2,3
114       3       featured      both
115       4       city          1
116       4       featured      n
117       5       city          1,4
118       5       featured      h 
119       6       city          1
120       6       featured      h

次の条件を持つ投稿のリストを取得するクエリを実行しようとしています。

  1. 都市に対する値の AND が 1 である
  2. Featured の値が h または両方の AND である
  3. 投稿ステータスが公開かつ
  4. 投稿タイプがストアの場合
  5. タイトル順に並べる

私がしようとしているクエリは

SELECT DISTINCT posts.ID , posts.*, postmeta.*
            FROM posts, postmeta
            WHERE posts.ID = postmeta.post_id
            AND (postmeta.meta_value  = 'h' OR postmeta.meta_value = 'both') 

AND (postmeta.meta_key = 'post_city_id' AND (postmeta.meta_value LIKE '%,1,%' OR postmeta.meta_value LIKE '%1,%'  OR postmeta.meta_value LIKE '%,1%' OR postmeta.meta_value LIKE '%1%'))

            AND posts.post_status = 'Publish' 
            AND posts.post_type = 'Store'

            ORDER BY (SELECT postmeta.meta_value from postmeta where (posts.ID = postmeta.post_id) and postmeta.meta_key LIKE '%home_featured_type%') asc, posts.post_title LIMIT 0,6

正しい戻り値は ID 1 と 2、つまり abc と def です。しかし、私は空の結果を得ています。どこが崩れているのか見当がつきません。これはどのように修正できますか?

4

3 に答える 3

2

ここに固定クエリがありますが、私はまだ不思議なことを理解していませんORDER BY (SELECT).

http://sqlfiddle.com/#!2/5ce5a/19

SELECT DISTINCT posts.ID , posts.*, postmeta_city.*, postmeta_featured.*

FROM       posts

INNER JOIN postmeta AS postmeta_city
     ON     postmeta_city.post_id = posts.ID
    AND     postmeta_city.meta_key = 'city'
    AND (   postmeta_city.meta_value LIKE '%,1,%'
         OR postmeta_city.meta_value LIKE '%1,%'
         OR postmeta_city.meta_value LIKE '%,1%'
         OR postmeta_city.meta_value LIKE '%1%'
        )
INNER JOIN postmeta AS postmeta_featured
     ON     postmeta_featured.post_id = posts.ID
    AND     postmeta_featured.meta_key = 'featured'
    AND (   postmeta_featured.meta_value = 'h'
         OR postmeta_featured.meta_value = 'both'
        )

WHERE posts.post_status = 'Publish' 
  AND posts.post_type = 'Store'

ORDER BY (
    SELECT postmeta.meta_value
    FROM postmeta
    WHERE ( posts.ID = postmeta.post_id )
      AND postmeta.meta_key LIKE '%home_featured_type%'
  ) asc,
  posts.title

LIMIT 0,6;
;

他の人のアイデアで更新されたので、賛成票を投じてください:

http://sqlfiddle.com/#!2/5ce5a/33

SELECT DISTINCT posts.ID , posts.*, postmeta_city.*, postmeta_featured.*

FROM       posts

INNER JOIN postmeta AS postmeta_city
     ON postmeta_city.post_id = posts.ID
    AND postmeta_city.meta_key = 'city'
    AND FIND_IN_SET('1', postmeta_city.meta_value)

INNER JOIN postmeta AS postmeta_featured
     ON postmeta_featured.post_id = posts.ID
    AND postmeta_featured.meta_key = 'featured'
    AND postmeta_featured.meta_value IN ('h','both')

WHERE posts.post_status = 'Publish' 
  AND posts.post_type = 'Store'

ORDER BY (
    SELECT postmeta.meta_value
    FROM postmeta
    WHERE ( posts.ID = postmeta.post_id )
      AND postmeta.meta_key LIKE '%home_featured_type%'
  ) asc,
  posts.title

LIMIT 0,6;
;
于 2012-06-19T16:34:00.823 に答える
1

AND列をing しているため、空の結果セットを取得しているためmeta_value、同時に 2 つの値に等しくなければなりませんが、これは不可能です。のようなものval = '1' AND val = 'both'は常に false を返し、どの行も結合しません。OR代わりに、都市 -> 1 および注目 -> h/both という条件の間を使用する必要があります。

投稿には city -> 1 と featuring -> h/both の両方が含まれている必要があるため (これらは列ではなく複数の行にまたがっています)、aHAVINGと組み合わせて節を使用してGROUP BY、各投稿が 2 つの行に結合され、両方を満たすようにする必要があります。条件...どちらでもありません。

LIKEまた、の存在をチェックするのは非常に多くの1です。代わりにFIND_IN_SETを使用できます。

SELECT
    *
FROM
    posts a
INNER JOIN
    postmeta b ON a.ID = b.post_id
    AND
    (
        (b.meta_key = 'city' AND FIND_IN_SET('1', b.meta_value) > 0)
        OR  
        (b.meta_key = 'featured' AND b.meta_value IN ('h', 'both'))
    )
WHERE
    a.post_status = 'Publish'
    AND a.post_type = 'Store'
GROUP BY
    a.ID
HAVING
    COUNT(*) = 2
ORDER BY
    a.title
于 2012-06-19T17:30:06.383 に答える
0

これを試して :

SELECT DISTINCT posts.ID , posts.*, postmeta.*
            FROM posts AS p INNER JOIN postmeta AS pm
            WHERE p.ID = pm.post_id
            AND (pm.meta_value  in ('h','both') 

AND (pm.meta_key = 'city' AND 
(pm.meta_value LIKE '%,1,%' OR pm.meta_value LIKE '%1,%'  OR pm.meta_value LIKE '%,1%' OR pm.meta_value LIKE '%1%'))

            AND posts.post_status = 'Publish' 
            AND posts.post_type = 'Store'

            ORDER BY p.title LIMIT 0,6

タイトルのみで並べ替えたいので、「order by」句にクエリを記述する必要はありません。

于 2012-06-19T16:37:33.390 に答える