MySQL row as a column - mysql

I have this query result and I would like the second row for each id to be added as a
SELECT m.post_id,m.meta_value,p.post_title
from events_posts p
inner join events_postmeta m
on p.ID=m.post_id and p.post_type='event' and (p.post_status='publish' or p.post_status='recurring')
and(m.meta_key='address' or m.meta_key='st_date')
order by m.post_id
column.
The results right now :
post_id meta_value post_title
15 Carolina Beach Road, Wilmington, NC, United States An Art Exhibition
15 2014-02-03 An Art Exhibition
19 Dakota Street, Winnipeg, MB, Canada Weekly Karate Classes
19 2014-02-06 Weekly Karate Classes
23 Alaskan Way, Seattle, WA, United State Christmas Carnival
23 2014-02-03 Christmas Carnival
I would like it to be
post_id | meta_value| post_title
15 | Carolina Beach Road, Wilmington, NC, United States | An Art Exhibition | 2014-02-03
19 |Dakota Street, Winnipeg, MB, Canada |Weekly Karate Classes |2014-02-06
23 |Alaskan Way, Seattle, WA, United State |Christmas Carnival |2014-02-03

You are actually not trying to convert rows to columns. You are trying to merge two rows of your query into one. This behaviour should be possible through joining the events_postmeta twice.
SELECT p.ID, m1.meta_value as event_address, m2.meta_value as event_date, p.post_title
from events_posts p
inner join events_postmeta m1
on p.ID=m1.post_id and p.post_type='event' and (p.post_status='publish' or p.post_status='recurring')
and m1.meta_key='address'
inner join events_postmeta m2
on p.ID=m2.post_id and p.post_type='event' and (p.post_status='publish' or p.post_status='recurring')
and m2.meta_key='st_date'
order by p.ID
That way the m1-join adds the address as a column and the m2-join adds the date. I could not test this but I am pretty sure it works (modulo some typing syntax mistakes).

Related

MySQL having three joins that needs form in one join

i need to join tables to see which product is cheaper in terms of their continent. i have provided more detail below.
I have the following four tables:
country Product1 Product2 Product3
Austria 0.01 0.011 0.018
Cuba 0.15 0.015 0.012
Angola 0.17 0.017 0.019
Benin 0.84 0.015 0.025
Belize 0.24 0.019 0.018
where table name is PriceComparison
Code name continent_code
AD Andorra EU
AF Afghanistan AS
AI Anguilla NA
AL Albania EU
AO Angola AF
table name is countries
Id Name countrycode
1 Albania AL
2 Algeria DZ
3 Andorra AD
4 Angola AO
5 Austria AT
table name is CountryList
code name
AF Africa
AN Antarctica
AS Asia
EU Europe
NA North America
OC Ocenia
SA South America
table name is continents
Code name continent_code
AD Andorra EU
AF Afghanistan AS
AI Anguilla NA
AL Albania EU
AO Angola AF
table name is countries
Id Name countrycode
1 Albania AL
2 Algeria DZ
3 Andorra AD
4 Angola AO
5 Austria AT
table name is CountryList
code name
AF Africa
AN Antarctica
AS Asia
EU Europe
NA North America
OC Ocenia
SA South America
table name is continents
I need to update my PriceComparison with all the other tables i have. The objective here is to see which continent we are cheaper in terms of our products. Product1 is my product. Product1's price needs to be compared with product2's price and again product1's price needs to be compared to product3's price in terms of where my product is cheaper per continent.
Can someone assist with this query?
Tried so far:
select countries.continent_code,
continents.code,
CountryList.countrycode,
countries.code,
PriceComaprison.country,
CountryList.name
from CountryList as CL
inner join countries
on countries.continent_code = continents.code
inner join CL
on CL.countrycode = countries.code
inner join PriceComparison
on PriceComparison.country = CL.name
sample data:
countries: code (AS, AI,AO, BB,CA) name (the actual country name - eg.America Samao) continent_code (OC,NA,AN - the actual continent_code of the country)
CountryList table: id Name countrycode
continents: code name
Based on what you explained in the comments, this could be close to what you need:
select con.code continenct_code, con.name as continent, product1, Product2, product3
from PriceComparison p join countries c on p.country = c.name
join continents con on con.code = c.continent_code
where Product1 < Product2 and Product1 < Product3
However, the sample data you have provided is not correct. As it is already mentioned in the comments to your question, there are countries in the PriceComparison table that do not exist in the Countries table-if you run this with your real data I would assume this should work.
I did modify a little your data and you can check it here.
This query will show the average price of each product per continent, if you want the smallest price per continent use MIN() instead of AVG()
SELECT con.code,
AVG(p.product1),
AVG(p.product2),
AVG(p.product3)
FROM PriceComparison p
JOIN countries c ON p.country = c.name
JOIN continents con ON con.code = c.continent_code
GROUP BY con.code

Find MAX(Avg(value)) after grouped by two fields

The table name is c_list.
Country City Rating Date
------------------------------------
France Brest 95 24092016
France Brest 98 27092016
France Brest 95 03102016
France Lille 100 26092016
France Lille 92 28092016
Japan Tokyo 98 02102016
There are more than 50 different countries and each country have few cities. And each city may have more than one row of record or more. I want to select one City with highest average Rating (Compare to Cities in it's own country) and then compare with all other cities in different countries. So, the final query should display all Country and their ONE City with max(avg(Rating)) and in desc order. The sample output:
Country City max(avg(rating))
-------------------------------------
USA New York 97.25
UK Cardiff 96.70
Germany Greven 96.50
Turkey Afyon 94.88
France Guipavas 94.10
Canada Cartwright 91.35
I can only get the max(avg(rating)) for one country. Need help.
SELECT top 1 country, city, Avg(rating) AS Ratings
FROM c_list
where country = 'France'
GROUP BY city, country
order by Ratings desc
(Edited) The result that I want is similar like Miss world contest. Compete and win against local contestant in your country first. Next (my final result set) is to compete against the winners from other countries and rank them first to last using their avg(rating) that they got eatlier in their country.
If am not wrong you are looking for this
SELECT country,
city,
Avg(rating) AS Ratings
FROM c_list A
GROUP BY city,
country
HAVING Avg(rating) = (SELECT TOP 1 Avg(rating) AS Ratings
FROM c_list B
WHERE a.country = b.country
GROUP BY city
ORDER BY ratings DESC)
ORDER BY ratings DESC
Note : If you are using Mysql the replace TOP keyword with LIMIT
Base table:
select t.* from temp_lax t
COUNTRY CITY RATING
1 France Brest 95
2 France Brest 98
3 France Brest 95
4 France Lille 100
5 France Lille 92
6 Japan Tokyo 98
Query:
select t1.country, t1.city, Avg(t1.Rating) rating
from temp_lax t1
group by t1.country, t1.city
having avg(t1.rating) = (select max(avg(rating))
from temp_lax t2
WHERE t1.country = t2.country
GROUP BY t2.city)
order by rating desc
OUTPUT:
COUNTRY CITY RATING
1 Japan Tokyo 98
2 France Lille 96
3 France Brest 96
Please let me know if you are looking for different result set.

SQL Remove duplicates

I'm new to SQL and my current sql query is:-
SELECT
CONCAT(LastName,', ',FirstName)AS 'Name',</li>
City,
Country,
ShipCity AS 'Shipped City'
From
itstudies.employees
INNER JOIN
Orders
ON Employees.EmployeeID = Orders.EmployeeID
WHERE City = ShipCity;
This query shows the output as:-
(Only part of the output is shown.)
Name City Country Shipped City
Smith, Jo York UK York
Avery, Paul Dallas USA Dallas
Avery, Paul Dallas USA Dallas
Kris, Jan York UK York
Kris, Jan York UK York
Hill, Ros Boston USA Boston
I need to take out the duplicates and change the query to show:-
Name City Country Shipped City
Smith, Jo York UK York
Avery, Paul Dallas USA Dallas
Kris, Jan York UK York
Hill, Ros Boston USA Boston
Thanks in advance.
You could just use
SELECT DISTINCT ...
but usually it is better to have a look at where the duplicates come from and work with a
GROUP BY
In this case you join with ORDERS and thus get duplicates for all orders of an employee. Is this join necessary? You could use
WHERE EXISTS (SELECT 1 FROM Orders WHERE Orders.EmployeeId=Employees.EmployeeId)
to get only employees who ordered.
Simple: Use the DISTINCT keyword.
You can refer to http://www.w3schools.com/sql/sql_distinct.asp for more details ;)

List SQL data by a count of a group

I hope you can help me with an SQL statment that I can't seem to figure out.
I have a table with a list of visits made, with the country visited and the dates such as;
United Kingdom, 1st Nov 2009
Germany, 8th June 2010
Frane, 10th September 2011
United Kingdom, 11th october 2011
etc.
I want to extract the data so that I get a table list such as follows
Times Visited - Country list
23 - United Kingdom
10 - France, Germany
4 - Czech Republic, USA, Canada
1 - Poland, Serbia, Argentina, New Zealand
So that the data shows that I have made 4 visist to the Czech Republic, USA & Canda
And the query
select * from
(
select count(*) as "trips", country from trip_view
group by country
order by 1 desc
) as a
returns the data
23 United Kingdom
10 France
10 Germany
4 Czech Republic
4 USA
4 Canada
etc.
So I need a kind of group on the outer SQL, but if I do the following
select * from
(
select count(*) as "trips", country from trip_view
group by country
order by 1 desc
) as a
group by trips
Then I only get 1 entry for each country. i.e.
23 United Kingdom
10 France
4 Czech Republic
etc.
So for each row I only have 1 country listed and not all of them. i.e. Row 2 should show France & Germany and row 3 should show Czech, USA & Canada
Any ideas how to do this in mysql?
Thanks
Using GROUP_CONCAT on the country column it should yield the result you want:
SELECT trips,
GROUP_CONCAT(country) AS country
FROM (
SELECT COUNT(*) AS "trips",
country
FROM trip_view
GROUP BY country
) a
GROUP BY trips
ORDER BY 1 DESC
Output:
TRIPS COUNTRY
23 United Kingdom
10 France,Germany
4 Czech Republic,Canada,USA
Live DEMO.

Grouping Sql Tables

I have three tables which i have joined ..but the manner in which i have to display them is a little difficult for me to understand.I am trying to group them and not getting the desired result.
Sports_Name
Id | Name
---------
1 Football
2 Cricket
3 Hockey
4 Tenis
Teams
Id | Sport_Id | Team_Name
----------------------------
101 1 Manchester United
103 2 Australia
104 2 India
109 1 Real Madrid
110 3 New Zeland
Player_Name
Id | Team_Id | Player_Name
------------------------------
1 101 Rooney
2 104 Tendulkar
3 103 Ponting
4 109 Ronaldo
5 101 Van Persie
6 110 Simond
I need to display this information in the following manner..
**Football**
Manchester United -Rooney
Manchester United -Van Persie
Real Madrid -Ronaldo
**Cricket**
India-Tendulkar
Australia-Ponting
**Hockey**
New Zeland -Simond
and something similar for tenis
See this picture for details
Is this what you want?
SELECT sports_name.name, teams.team_name, player_name.player_name FROM player_name
JOIN
teams ON
player_name.team_ID = teams.ID
JOIN
sports_name on
sports_name.id = teams.sport_id
order by sports_name.name, team_name
This gets all the data in order then you just need to use your presentation layer to use sports.name as group header.
This produces
name team_name player_name
Cricket Australia Ponting
Cricket india Tendulkar
Football Man u Rooney
Football Man u RVP
Football Real Madrid Ronaldo
Hockey N Z Simond
try this:
SELECT T.TEAM_NAME+' - '+ P.PLAYER_NAME as 'FOOTBALL'
FROM TEAMS T JOIN PLAYER_NAME P
ON T.ID=P.TEAM_ID
JOIN SPORTS_NAME S
ON T.SPORT_ID=S.ID
WHERE S.NAME='FOOTBALL'
Change the where clause to 'Cricket','Hockey' to get other results
The basic query would be something like:
SELECT s.Name, t.Name, p.Player_Name
FROM Player_Name p
INNER JOIN Teams t
ON t.Id = p.Team_id
INNER JOIN Sports_Name s
ON s.Id = t.Sport_Id
Then if you want to display the results like you described it, my guess would be to use a cursor. Use parameterized procedure to add a WHERE clause to the query in order to filter the results by sport's name.