Re: Column headings in csv
Richard Yates <[email protected]> Sun, 24 May 2020 05:00:36 -0700
| Newsgroups | comp.databases.mysql |
|---|---|
| Organization | A noiseless patient Spider |
| Message-ID | <[email protected]> |
On Sun, 24 May 2020 11:34:45 +0200, Luuk <[email protected]> wrote: >On 24-5-2020 03:07, Richard Yates wrote: >> On Sat, 23 May 2020 17:19:09 -0700, Richard Yates >> <[email protected]> wrote: >> >>> On Sat, 23 May 2020 19:11:00 -0400, Jerry Stuckle >>> <[email protected]> wrote: >>> >>>> On 5/23/2020 2:14 PM, Richard Yates wrote: >>>>> On Sat, 23 May 2020 17:04:43 +0200, Luuk <[email protected]> wrote: >>>>> >>>>>> On 23-5-2020 15:49, Richard Yates wrote: >>>>>>> On Sat, 23 May 2020 10:13:00 +0200, Luuk <[email protected]> wrote: >>>>>>> >>>>>>>> On 23-5-2020 01:47, Richard Yates wrote: >>>>>>>>> On Sun, 02 Feb 2020 13:57:48 +0100, Kees Nuyt <[email protected]> >>>>>>>>> wrote: >>>>>>>>> >>>>>>>> >>>>>>>>>> Yeah, you can only ORDER the result of the UNION, not on of its >>>>>>>>>> parts. >>>>>>>>> >>>>>>>>> Actually you can if you order each part and then set a limit. Recently >>>>>>>>> I found this out and am using this (in a php application). >>>>>>>>> >>>>>>>>> (Distribution sites are each assigned to one of several districts. The >>>>>>>>> query pulls out the ones from one of the districts to list first at >>>>>>>>> the top of a dropdown menu, and then lists the remaining ones.) >>>>>>>>> >>>>>>>>> $distsitesq=" >>>>>>>>> (select distsite, name from distsites >>>>>>>>> where ID_district=$ID_district >>>>>>>>> order by name limit 999) union >>>>>>>>> (select distsite, name from distsites >>>>>>>>> where ID_district<>$ID_district >>>>>>>>> order by name limit 999)"; >>>>>>>>> >>>>>>>>> 999 is chosen because in this example it is far larger than the >>>>>>>>> distsites table will ever be. Setting the limit enforces the ordering >>>>>>>>> of each part. >>>>>>>>> >>>>>>>> This is not right, it might give look like the correct result, but it is >>>>>>>> not guaranteed the correct result. >>>>>>> >>>>>>> It does produce the correct result in my application. How would it not >>>>>>> produce that result? >>>>>> >>>>>> https://dev.mysql.com/doc/refman/8.0/en/union.html >>>>>> >>>>>> "Use of ORDER BY for individual SELECT statements implies nothing about >>>>>> the order in which the rows appear in the final result because UNION by >>>>>> default produces an unordered set of rows. " >>>>> >>>>> Yes, I understand what the manual says but quoting the manual does not >>>>> answer my question. I would point out two things: >>>>> >>>>> 1. Without the LIMITs in the two parts, an error is indeed thrown by >>>>> mysql, but with the limits it passes, suggesting that mysql thinks >>>>> that the query is proper. >>>>> >>>>> 2. The manual describes the "default" behavior. It seems that the >>>>> default may be overridden in some circumstances, such as the query I >>>>> used. That is even the definition of "default". The manual does not >>>>> say "always produces an unordered set" >>>>> >>>>> Nevertheless, the query that I used works. Since you said that the >>>>> correct result was not guaranteed, I was asking if you knew in which >>>>> circumstances it would not work, or reasons that it would not work. >>>>> >>>> >>>> I agree with Luuk - this isn't a good construct. As for it "working" - >>>> I suspect it's just a hole in the SQL parser code. Adding LIMIT to a >>>> clause should not change the validity of ORDER. >>> >>> I am not at all claiming that it is better or even good. And I have >>> substituted in Luuk's suggestion (thanks again!) which also showed me >>> a clever technique that I can probably use in other places. >>> >>> But wouldn't a "hole in the parser code" just account for it not >>> throwing an error and not explain why it really does work? I tried >>> scrambling the order of the table just to see if the fact that it >>> worked was just an artifact of a particular order, but it still works. >>> No matter what I do I cannot make it not work. >>> >>> So perhaps, as you say, adding a LIMIT to a clause (in a union) SHOULD >>> not change the validity of ORDER in the clause in some hypothetical >>> moral domain, but it seems that it actually does do that in unions. >>> >>> Why not call this an undocumented feature rather than a "hole"? >> >> Still cannot break it. Did discover that the parentheses around each >> part are necessary. >> >> (select owner, make, model, color from cars >> where owner='Jerry' >> order by make, model limit 10) >> union >> (select owner, make, model, color from cars >> where owner='Luuk' >> order by color limit 10) >> union >> (select owner, make, model, color from cars >> where owner<>'Luuk' and owner<>'Jerry' >> order by model limit 10) >> >> Jerry Audi A3 red >> Jerry Audi TT silver >> Jerry Ford Fiesta green >> Jerry Ford Fiesta blue >> Jerry GMC Savannah blue >> Jerry GMC Sierra blue >> >> Luuk GMC Yukon black >> Luuk Ford F100 blue >> Luuk GMC Savannah blue >> Luuk Ford Mustang green >> Luuk Ford Fiesta red >> >> Zor Audi A4 white >> TNP Ford Edsel black >> > >Ok, example, selecting the two lowest and the two highest values: > >WITH RECURSIVE cte (n) AS >( > SELECT 1 > UNION ALL > SELECT n + 1 FROM cte WHERE n < 5 >) >(SELECT * >FROM cte >order by n >limit 2 ) >union all >(SELECT * >FROM cte >order by n desc >limit 2 ) >order by n >; > >1) The 'with recursive' creates a temporary view containing 5 records >from 1 until (including) 5. > >2) In the 'SELECT * FROM cte order by n limit 2', the ORDER BY is needed >to make sure where get the first two records. Because of the LIMIT there >is also a need to know where to start, this can only be done using ORDER BY. > >3) after the union all we do the same select, again with 'order by' to >make sure the highest two values are selected. > >4) the final order by is needed to produce 1,2,4,5 and not 1,2,5,4 Sorry, that example is beyond me and I do not know what it is intended to show. And I've never run across RECURSIVE before.