简体   繁体   中英

Multiple selects on the same table

I'm trying to figure it ou a way to make this selects in the same query. I'm working on the wordpress database, and I have these SQL queries that works by themselves:

SELECT `meta_value` AS 'Name' FROM `wp_postmeta` WHERE `meta_key` =     "myfield1" ORDER BY `post_id` ASC
SELECT `meta_value` AS 'Department' FROM `wp_postmeta` WHERE `meta_key` = "myfield2" ORDER BY `post_id` ASC
SELECT `meta_value` AS 'Location' FROM `wp_postmeta` WHERE `meta_key` = "myfield3" ORDER BY `post_id` ASC
SELECT `meta_value` AS 'Job Title' FROM `wp_postmeta` WHERE `meta_key` = "myfield4" ORDER BY `post_id` ASC
SELECT `meta_value` AS 'Social Number' FROM `wp_postmeta` WHERE `meta_key` = "myfield5" ORDER BY `post_id` ASC

But I'd like to have them all on the same query so I can export the data later on a report. Here's what I've tried:

SELECT  
    (SELECT `meta_value` FROM `wp_postmeta` WHERE `meta_key` = "myfield1" ORDER BY `post_id` ASC) As name,
    (SELECT `meta_value` FROM `wp_postmeta` WHERE `meta_key` = "myfield2" ORDER BY `post_id` ASC) AS department,
    (SELECT `meta_value` FROM `wp_postmeta` WHERE `meta_key` = "myfield3" ORDER BY `post_id` ASC) AS location,
    (SELECT `meta_value` FROM `wp_postmeta` WHERE `meta_key` = "myfield4" ORDER BY `post_id` ASC) AS jobtitle,
    (SELECT `meta_value` FROM `wp_postmeta` WHERE `meta_key` = "myfield5" ORDER BY `post_id` ASC) AS socnumber

But that's returning commands out of sync. Anyone knows how to fix this?

#2014 - Commands out of sync; you can't run this command now 

Edit: I'm querying the wp_postmeta table, it has 4 columns meta_id, post_id, meta_key and meta_value columns. I'm selecting the meta_value from a custom field I've added (called myfield1, saved in the meta_key column). I'm ordering by post_id which is the ID of the posts in wordpress so I get chronologic order.

But I have 5 custom fields, myfield1 to myfield5. And I wanted to query all of them once.

One method is to use conditional aggregation:

SELECT MAX(CASE WHEN `meta_key` = 'myfield1' THEN meta_value END) as Name,
       MAX(CASE WHEN `meta_key` = 'myfield2' THEN meta_value END) as Department,
       MAX(CASE WHEN `meta_key` = 'myfield3' THEN meta_value END) as Location,
       MAX(CASE WHEN `meta_key` = 'myfield4' THEN meta_value END) as JobTitle,
       MAX(CASE WHEN `meta_key` = 'myfield5' THEN meta_value END) as SocialNumber
FROM `wp_postmeta`
WHERE `meta_key` = "myfield5" 
GROPU BY post_id
ORDER B post_id ASC;

You can't select the same column with as different alias (`'meta_value' AS 'Name' ... etc) and get the results as one set. The column can only have one name!

The best you can do is something like this:

SELECT `meta_value`, `meta_key`
FROM `wp_postmeta`
WHERE `meta_key` IN ("myfield1", "myfield2", "myfield3", "myfield4", "myfield5")
ORDER BY `post_id` ASC

Which will give you all your values in one result set, with the meta_key column too so you can tell which is which.

To get a resultset with five columns (one for each custom field) you have to join the table to itself five times...

Something like this:

SELECT
    pm1.meta_value AS 'Name' 
    pm2.meta_value AS 'Department'
    pm3.meta_value AS 'Location'
    pm4.meta_value AS 'Job Title'
    pm5.meta_value AS 'Social Number'

 FROM `wp_postmeta` pm1
    JOIN `wp_postmeta` pm2 ON pm1.post_id = pm2.post_id
    JOIN `wp_postmeta` pm3 ON pm1.post_id = pm3.post_id
    JOIN `wp_postmeta` pm4 ON pm1.post_id = pm4.post_id
    JOIN `wp_postmeta` pm5 ON pm1.post_id = pm5.post_id

WHERE
    pm1.meta_key = "myfield1"
    AND pm2.meta_key = "myfield2"
    AND pm3.meta_key = "myfield3"
    AND pm4.meta_key = "myfield4"
    AND pm5.meta_key = "myfield5"

 ORDER BY `post_id` ASC

I haven't checked the SQL syntax, so forgive me if there's a syntax error!

Assuming this is mySQL?

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM