כמה שורות לכמה שדות - SQL
-
אני רוצה להשיג כמה שדות מכמה שורות באותה טבלה לחיבור אחד
בינתיים עשיתי כך (האם זה הדך היחידה או שיש דרך נקייה יותר?)
SELECT item.order_item_id, item.order_id, metaitem_product_id.meta_value as product_id, product_post.post_title as product_name, metaitem_qty.meta_value as qty, metaitem_total_price.meta_value as total_price, metaitem_total_price.meta_value / metaitem_qty.meta_value as unit_price, order_post.post_date as order_date FROM wp_woocommerce_order_items as item LEFT JOIN wp_woocommerce_order_itemmeta as metaitem_product_id ON item.order_item_id = metaitem_product_id.order_item_id LEFT JOIN wp_woocommerce_order_itemmeta as metaitem_qty ON item.order_item_id = metaitem_qty.order_item_id LEFT JOIN wp_woocommerce_order_itemmeta as metaitem_total_price ON item.order_item_id = metaitem_total_price.order_item_id LEFT JOIN wp_posts as product_post ON metaitem_product_id.meta_value = product_post.ID LEFT JOIN wp_posts as order_post ON order_post.ID = item.order_id WHERE item.order_item_type = 'line_item' AND metaitem_product_id.meta_key = '_product_id' AND metaitem_qty.meta_key = '_qty' AND metaitem_total_price.meta_key = '_line_total'
שאלתי השניה היא איך אוכל להחזיר שדה ריק עם הwhere לא נמצאה באחד הjoin?
-
@ש-ב-ח יש בצעם שני חלקים בשאילתה שלך,
טבלת אב (item) והרבה טבלאות משנה לפי קשרים לטבלת האב (למעט אחד)
כעת בתנאים יש לך גם שני סוגי תנאים,
א) תאנים לאיזה שורות אתה רוצה בעצם, א) תנאים שהם בעצם בירור הJOIN, כלומר "תעשה JOIN עם הטבלה X רק אם"כעת אתה שואל איך אתה מפעיל את הסוג השני בלי לסנן מטבלת האב.
יש שני דרכים:
א. JOIN מרובה תנאים, כלומר תכתוב:ON metaitem_product_id.meta_value = product_post.ID AND metaitem_product_id.meta_key = '_product_id'
ב. לעשות תת שאילתות, כלומר טבלאות הבנים בעצם יהיו שאילתות שכוללות את הwhere מוקפות סוגריים, ותתייחס לזה כטבלה ועל זה הJOIN
אפשר בתת שאילתה לאגד כמה טבלאות ביחד עם תנאים, ואז לאחד אותם עם טבלת הitem.
-
@dovid
השאלה עם אני יכול לקחת את ההטבלה wp_woocommerce_order_itemmeta
ככה:SELECT meta_key, meta_value FROM wp_woocommerce_order_itemmeta WHERE wp_woocommerce_order_itemmeta.order_item_id = wp_woocommerce_order_item.order_item_id AND wp_woocommerce_order_itemmeta.meta_key IN('_product_id', '_qty', '_line_total')
כך אני יקבל את כל שלושת השורות הרלוונטיות עבורי עם המפתח והערך (בשני שדות)
ואז להפוך אותם לעמודות בשורה
(כמובן שכל זה היא שאילתה פנימית... בתוך השאילתה לעיל)אני כמעט בטוח שקיים כזה דבר (אולי זה נקרה טבלת ציר - pivot)
אבל לא יודע איך להתחיל ולא הצלחתי להבין ממרחבי הרשת.... אך אני מכניס כזו שאילתה בתוך שאילתה וכו'....אשמח להארותיך ועזרתך..
-
@ש-ב-ח אני מבין מה אתה שואף, אבל זה לא הטבע של SQL, וכל דרך להשיג את זה בקוד שייראה לך פסיכולוגית "קל יותר" עבור המנוע, הוא אחיזת עיניים.
קוד כזה הוא מצויין:SELECT item.order_item_id, item.order_id, metaitem_product_id.meta_value as product_id, product_post.post_title as product_name, metaitem_qty.meta_value as qty, metaitem_total_price.meta_value as total_price, metaitem_total_price.meta_value / metaitem_qty.meta_value as unit_price, order_post.post_date as order_date FROM wp_woocommerce_order_items as item LEFT JOIN wp_woocommerce_order_itemmeta as metaitem_product_id ON item.order_item_id = metaitem_product_id.order_item_id AND metaitem_product_id.meta_key = '_product_id' LEFT JOIN wp_woocommerce_order_itemmeta as metaitem_qty ON item.order_item_id = metaitem_qty.order_item_id AND metaitem_qty.meta_key = '_qty' LEFT JOIN wp_woocommerce_order_itemmeta as metaitem_total_price ON item.order_item_id = metaitem_total_price.order_item_id AND metaitem_total_price.meta_key = '_line_total' LEFT JOIN wp_posts as product_post ON metaitem_product_id.meta_value = product_post.ID LEFT JOIN wp_posts as order_post ON order_post.ID = item.order_id WHERE item.order_item_type = 'line_item'