I just read SQL: Ranking without self join, in which
Shlomi
Noach shares a nice MySQL-specific trick based on user-defined variables to compute rankings.
Shlomi's trick reminds me somewhat of the trick I came across
little over a year ago to caclulate percentiles. At that time, several
people pointed out to me too that using user-defined variables in
this way can be unreliable.The problem with user-defined
variablesSo what is the problem exaclty? Well, whenever a query
assigns to a variable, and that same variable is read in another
part of the query, you're on thin ice. That's because the …
Here’s a little something that might trip you up occasionally. Have a look at this test scenario:
USE test; DROP TABLE IF EXISTS a; DROP TABLE IF EXISTS b; DROP TABLE IF EXISTS c; CREATE TABLE a ( a INT ); CREATE TABLE b ( b INT ); CREATE TABLE c ( c INT ); SELECT a.a FROM a LEFT JOIN c ON c.c = a.a; -- Q1 SELECT a.a FROM a, b LEFT JOIN c ON c.c = a.a; -- Q2
Q1 and Q2 will produce the same result, right? Wrong! As of MySQL 5.0.12, per the SQL standard, JOIN has had higher precedence than comma ‘,’.
So, you get the following:
mysql> SELECT a.a FROM a LEFT JOIN c ON c.c = a.a; Empty set (0.00 sec) mysql> SELECT a.a FROM a, b LEFT JOIN c ON c.c = a.a; ERROR 1054 (42S22): Unknown column 'a.a' in 'on clause'
This is because, in earlier versions, MySQL interpreted it as ( ( a, b ) LEFT JOIN c ). Now, it interprets this syntax as ( a, ( b LEFT JOIN c ) ). If you run into this problem, the fix is easy. …
[Read more]I started playing around with protobuf when doing some stuff in Drizzle (more about that later), and since the examples where using IOStream, the table reader and writer that Brian wrote is using IOStreams. Now, IOStreams is pretty powerful, but it can be a pain to use, so of course I start tossing together some utilities to make it easier to work with.
Being a serious Perl addict since 20 years, I of course start
missing a lot of nice functions for manipulating strings, and the
most immediate one is join, so I wrote a C++ IOStream manipulator to
join the elements of an arbitrary sequence and output them to an
std::ostream
.
In this case, since the I/O Manipulator takes arguments, it has to be written as a class. Recall that …
[Read more]By “Good SQL Querying”, I am not referring to “how to make your queries more perfomant.” I am about to go on a mini-rant about how to make readable and self-documenting SQL queries.
One practice that will get me instantly going on a rant is using a comma join. There is NO reason to do the following:
-- uses the sakila sample database SELECT first_name, last_name, address FROM customer,address;
What kind of join did the original author intend? A CROSS JOIN? Or did they really want an INNER JOIN and forget the WHERE clause?
The answer: you do not know for sure; you can only guess. Had the query been
SELECT first_name,last_name,address FROM customer INNER JOIN address;
you would know that the author intended an INNER JOIN; had the query been
SELECT first_name,last_name,address FROM customer CROSS JOIN address;
you would know that the author intended a CROSS JOIN. I …
[Read more]