This question already has answers here:
Closed 12 years ago.
Possible Duplicate:
selecting items that come after a specific value
i asked this allready bu explained it very bad so i'm gonna do it right this time.
I have a mysql table like this:
ISBN title author price amount
978-0060850524 A Brave New World Aldous Huxley 6.49 7
978-0061743528 To Kill a Mockingbird Harper Lee 12.89 0
978-0142000670 Of Mice and Men John Steinbeck 5.99 89
978-0452284234 Nineteen Eighty-Four George Orwell 10.85 90
978-0452284241 Animal Farm George Orwell 9.80 24
978-0553574166 The Hutt Gambit A.C. Crispin 7.99 2
978-0553578850 The Mandalorian Armor. K.W. Jeter 7.99 20
978-0571056866 Lord of the Flies William 7.70 45
978-0765340788 The Machine Crusade Brian Herbert 7.99 14
978-0861404216 The Colour of Magic Terry 29.16 3
I want to create a query wich does the following.
I have a variable wich contains the ISBN of 1 of the products.
the query should select all the products ordered by the ISBN bust starting with the ISBN that was given in the variable. so if the ISBN is from item 4 the result should show all 10 books starting with item 5(yes it should start from 1 item after the item in the variable then 6,7,8,9,10,1,2,3,4 ,5
You can do this in a single query in MySql, like so:
SELECT * FROM `yourtable`
order by ISBN>'Your ISBN' desc, ISBN asc
Note: using ISBN>'Your ISBN' desc in the order by will ensure that
the higher ISBNs appear first, followed by the lower ones. Thereafter each group
is ordered by ISBN.
Only solution I see would be two queries with UNION :
SELECT *
FROM yourtable
WHERE ISBN = 'Your ISBN'
UNION
SELECT *
FROM (
SELECT *
FROM yourtable
WHERE ISBN <> 'Your ISBN'
ORDER BY ISBN
LIMIT 9
);
I'm not a huge fan of ORDER BY and LIMIT in subqueries, though...
Something like this should perform well:
(SELECT * FROM t1 WHERE ISBN > '978-0452284234' ORDER BY ISBN)
UNION ALL
(SELECT * FROM t1 WHERE ISBN <= '978-0452284234' ORDER BY ISBN)
SELECT *
FROM (
SELECT *
FROM books bo
WHERE isbn >
(
SELECT isbn
FROM books bi
WHERE id = 4
)
ORDER BY
isbn
LIMIT 10
) q
UNION ALL
SELECT *
FROM (
SELECT *
FROM books bo
ORDER BY
isbn
LIMIT 10
) q
LIMIT 10
Related
One of the test questions came by with following schemas, to look for the best doctor in terms of:
Best scored;
The most times/attempts;
For each medical procedures (in terms of name)
[doctor] table
id
first_name
last_name
age
1
Phillip
Singleton
50
2
Heidi
Elliott
34
3
Beulah
Townsend
35
4
Gary
Pena
36
5
Doug
Lowe
45
[medical_procedure] table
id
doctor_id
name
score
1
3
colonoscopy
44
2
1
colonoscopy
37
3
4
ulcer surgery
98
4
2
angiography
79
5
3
angiography
84
6
3
embolization
87
and list goes on...
Given solution as follow:
WITH cte AS(
SELECT
name,
first_name,
last_name,
COUNT(*) AS procedure_count,
RANK() OVER(
PARTITION BY name
ORDER BY COUNT(*) DESC) AS place
FROM
medical_procedure p JOIN doctor d
ON p.doctor_id = d.id
WHERE
score >= (
SELECT AVG(score)
FROM medical_procedure pp
WHERE pp.name = p.name)
GROUP BY
name,
first_name,
last_name
)
SELECT
name,
first_name,
last_name
FROM cte
WHERE place = 1;
It'll mean a lot to be clarified on/explain on how the WHERE clause worked out under the subquery:
How it worked out in general
Why must we match the two pp.name and p.name for it to reflect the correct rows...
...
WHERE
score >= (
SELECT AVG(score)
FROM medical_procedure pp
WHERE pp.name = p.name)
...
Thanks a heap!
Above is join with doctor and medical procedure and group by procedure name and you need doctor names with most attempt and best scored.
Subquery will join by procedure avg score and those who have better score than avg will be filtered.
Now there can be multiple doctor better than avg so taken rank by procedure count so most attempted will come first and then you taken first to pick top one
I essentially like to have one query which I'll execute one time and like to have the result (no multiple query execution) and definitely, the query should use simple MySQL structure (no complex/advanced structure to be used like BEGIN, loop, cursor).
Say I've two tables.
1st Table = Country (id(PK), name);
2nd Table = Businessman (id(PK), name, city, country_id(FK))
Like to SELECT all countries, whose businessmen are from distinct cities. No two businessmen exist in one country, who are from the same city. If so, that country will not be selected by the SELECT clause.
Country
id name
1 India
2 China
3 Bahrain
4 Finland
5 Germany
6 France
Businessman
id name city country_id
1 BM1 Kolkata 1
2 BM2 Delhi 1
3 BM3 Mumbai 1
4 BM4 Beijing 2
5 BM5 Paris 6
6 BM6 Beijing 2
7 BM7 Forssa 4
8 BM8 Anqing 2
9 BM9 Berlin 5
10 BM10 Riffa 3
11 BM11 Nice 6
12 BM12 Helsinki 4
13 BM13 Bremen 5
14 BM14 Wiesbaden 5
15 BM15 Angers 6
16 BM16 Sitra 3
17 BM17 Adliya 3
18 BM18 Caen 6
19 BM19 Jinjiang 2
20 BM20 Tubli 3
21 BM21 Duisburg 5
22 BM22 Helsinki 4
23 BM23 Kaarina 4
24 BM24 Bonn 5
25 BM25 Kemi 4
In this respect, China and Finland shouldn't be listed.
I've attempted using count and group by, but no luck.
Can you please help me to build up this query.
Here it is, all you need is to join Businessman table and count cities and distinct cities and if they equal that means all businessmen are from different cities:
SELECT
c.`id`,
c.`name`,
COUNT(b.`id`) AS BusinessmanCount,
COUNT(b.`city`) AS CityCount,
COUNT(DISTINCT b.`city`) AS DistinctCityCount
FROM `countries` c
INNER JOIN Businessman b ON c.`id` = b.`country_id`
GROUP BY c.`id`
HAVING CityCount = DistinctCityCount
For minified version what you exactly need:
SELECT
c.`id`,
c.`name`
FROM `countries` c
INNER JOIN Businessman b ON c.`id` = b.`country_id`
GROUP BY c.`id`
HAVING COUNT(b.`city`) = COUNT(DISTINCT b.`city`)
Well, I think we should have waited for you to show your own query, because one learns best from mistakes and their explanations. However, now that you've got answers already:
Yes, you need group by and count. I'd group by cities to see if I got duplicates. Then select countries and exclude those that have duplicate cities.
select *
from country
where id not in
(
select country_id
from businessmen
group by city, country_id
having count(*) > 1
);
You need either nested aggregations:
select *
from Country
where id in
(
select country_id
from
(
select city, country_id,
count(*) as cnt -- get the number of rows per country/city
from Businessman
group by city, country_id
) as dt
group by country_id
having max(cnt) = 1 -- return only those countries where all counts are unique
)
Or compare two counts:
select *
from Country
where id in
(
select country_id
from Businessman
group by country_id
having count(*) = count(distinct city) -- number of cities is equal to umber of rows
)
I have a table, it similar with this table
ID Name Age Status
1 John 32 Life
2 Andre 99 Life
3 Anton 89 Dead
4 Maria 99 Life
5 Mario 13 Life
6 Santi 89 Dead
7 Anggy 56 Dead
8 Amir 99 Life
I want to do something like this
1. Group rows by status (Life)
2. Get the max Age from that group (99) (only the max number need)
4. Make new group by age and sort it by ID.
The result will be
8 Amir 99 Life
4 Maria 99 Life
2 Andre 99 Life
Any way to use only 1 line query for that job? with some (php) data procesing its not to hard to get the result i want, but i want to make code as clean as posible, so maybe i can do that 3 step in just a single query?
I think the right logic is:
select t.id, t.name, t.age, t.status
from table t join
(select max(t2.age) from table t2 where t2.status = 'life') m
on t.age = m.age
where t.status = 'life'
order by id desc;
select id, name, age, status
from thetable
where age =
(select max(age)
from thetable
where status="Life"
)
where status="Life"
order by id desc
Use the below mentioned query :
SELECT
*
FROM
t4
CROSS JOIN
(SELECT
MAX(`age`) AS 'age'
FROM
t4
WHERE
`status` = 'Life') AS t5
WHERE
`status` = 'Life' AND t4.`age` = t5.age
ORDER BY `id` DESC;
Check SQLFiddle
I have an SQL selection which return the following:
Name Code Qty
Janet 10 6
Janet 11 9
Janet 09 8
Jones 12 7
Jones 11 8
James 09 5
James 10 4
I want this selection to get sorted based on the qty for all the three people : order the people by their maximum quantity, and then order by quantity.
The output should look like this:
Janet 11 9
Janet 09 8
Janet 10 6
Jones 11 8
Jones 12 7
James 09 5
James 10 4
Any way to achieve this?
This is a subtle problem. It looks like you want to sort the names by the maximum of qty. This requires a join and aggregation to get the maximum qty for each name:
select t.*
from table t join
(select name, max(qty) as maxq
from table t
group by name
) tt
order by tt.maxq desc, tt.name, t.qty desc;
Try this:
SELECT * FROM `names` ORDER BY name ASC, qty DESC
SELECT Name, Code, Qty
FROM names AS main JOIN
(SELECT Name, MAX(Qty) AS max_qty
FROM names
GROUP BY Name) AS max_names USING (Name)
ORDER BY max_names.max_qty DESC, names.Qty DESC
The virtual table max_names contains the maximal Qty for each Name:
Janet 9
Jones 8
James 5
Then you join it to the original table and sort according to this max_qty.
If you want to sort according to the total quantity per name, just replace MAX with SUM:
SELECT Name, Code, Qty
FROM names AS main JOIN
(SELECT Name, SUM(Qty) AS sum_qty
FROM names
GROUP BY Name) AS sum_names USING (Name)
ORDER BY sum_names.sum_qty DESC, names.Qty DESC
The sum_names table will contain:
Janet 23
Jones 15
James 9
You can specify more than one sorting condition:
SELECT * from names order by name, qty desc
Above query will sort by name and if names are equal then will sort by qty
If you want to select only higher qty for every user then use this query:
SELECT name, MAX(qty) FROM names GROUP BY name order by MAX(qty);
I'd like to get some sort of Top Ten list from a table a MySQL database.
Here's an example. Let's say I have this table:
ID Username Town
1 foo Munich
2 bar Kolding
3 herp Bordeaux
4 derp Bordeaux
5 test Cologne
6 bla Munich
7 blob Bordeaux
And now, I'd like to get the most common entries in 'Town', like this:
Bordeaux 3
Munich 2
Cologne 1
Kolding 1
What kind of query can do that?
SELECT Town, COUNT(*) AS cnt FROM my_table GROUP BY Town ORDER BY cnt DESC LIMIT 10
How about this.
SELECT Town, Count(1) as TownCount
FROM myTable
GROUP BY Town
ORDER BY TownCount DESC;
If you want only 10 records, use
SELECT Town, Count(1) as TownCount
FROM myTable
GROUP BY Town
ORDER BY TownCount DESC
LIMIT 10;
Try this -
SELECT town,
count(*)
FROM tablename
GROUP BY town;